2017-08-01 91 views
2

文件的外部HIVE表我有一個CSV與由第一列值來定義不同的記錄格式文件: 樣本數據:創建從不同的記錄格式爲csv文件

"EL","XXXXXXX", 2017-07-17 
"EH","XXXXXXX",1,2017-07-17,"AAA" 
"BI","XXXXXXX","AAA","BBBB" 

在這種情況下,我正在獲取3個已定義記錄類型的文件。 有沒有辦法將它加載到不同的配置單元表?

+0

可以定義一個通用的表,用5組通用字符串的列,然後定義3次輕敲該表與適當的WHERE過濾,且將適當的列選擇/轉換/重命名。 –

+0

@SamsonScharfrichter我們是否需要爲表格定義最長的字符串列數......因爲在我的情況下,每種記錄類型的列數是可變的? –

+0

如果這是外部表的一次性創建,請編寫一個shell腳本以根據第一列值將記錄移動到三個不同的文件中,然後在每個文件的頂部創建外部表。你也可以通過寫一個豬腳本來做到這一點 – hadooper

回答

1

演示

create table el (s1 string,d1 date); 
create table eh (s1 string,i1 int,dt1 date,s2 string); 
create table bi (s1 string,s2 string,s3 string); 

create external table myfile 
(
    c1 string 
    ,c2 string 
    ,c3 string 
    ,c4 string 
    ,c5 string 
) 

row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
with serdeproperties 
(
    'separatorChar' = ',' 
    ,'quoteChar'  = '"' 
    ,'escapeChar' = '\\' 
) 
stored as textfile 
; 

select * from myfile; 

+-----+----------+--------------+-------------+-------+ 
| c1 | c2 |  c3  |  c4  | c5 | 
+-----+----------+--------------+-------------+-------+ 
| EL | XXXXXXX | 2017-07-17 | NULL  | NULL | 
| EH | XXXXXXX | 1   | 2017-07-17 | AAA | 
| BI | XXXXXXX | AAA   | BBBB  | NULL | 
+-----+----------+--------------+-------------+-------+ 

from myfile 
insert into el select c2,c3  where c1='EL' 
insert into eh select c2,c3,c4,c5 where c1='EH' 
insert into bi select c2,c3,c4 where c1='BI' 
; 

select * from el; 

+----------+-------------+ 
| s1 |  d1  | 
+----------+-------------+ 
| XXXXXXX | 2017-07-17 | 
+----------+-------------+ 

select * from eh; 

+----------+-----+-------------+------+ 
| s1 | i1 |  dt1  | s2 | 
+----------+-----+-------------+------+ 
| XXXXXXX | 1 | 2017-07-17 | AAA | 
+----------+-----+-------------+------+ 

select * from bi; 

+----------+------+-------+ 
| s1 | s2 | s3 | 
+----------+------+-------+ 
| XXXXXXX | AAA | BBBB | 
+----------+------+-------+ 
+0

只是爲了 - 用這種方法表示了我的假設..我需要使用len(列)爲最大記錄定義外部表。 –

+0

是(具有最多字段數的記錄) –

相關問題