2014-05-22 77 views
0

如何在Hive中加載CSV文件,每行有不同數量的列? 問題是每行都有一個未定義數量的字段,否則我會創建一個表,其CSV字段可以有最大數量的字段...在Hive中使用不同長度的行加載CSV文件

字段1到5將始終存在。然而,6到Infinity的區域可能並不總是在那裏。 可能可以接受的解決方案是將字段6連接到Infinity,同時在Hive中導入文件。

這可能嗎?

這裏是我的CSV文件的樣本要清楚:

我能想到的
data11;data12;data13;data14 
data21;data22;data23;data24;data25 
data31;data32;data33;data34;data35;data36 
data41;data42;data43 

回答

1

三個選項:

如果可能的字段數是不是真正的無限,但只是高於5 ,那麼你可以簡單地定義所有這些字段,而不存在於數據中的字段將僅爲空。

你可以寫一個自定義SerDe。

或者您可以將分隔符設置爲數據中不存在的內容,然後使用正則表達式自行提取字段。例如:

create table a(line string) row format delimited fields terminated by '\A'; 

create view b as 
select 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 1) as col1, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 2) as col2, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 3) as col3, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 4) as col4, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 5) as col5, 
split(regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 6), '\;') as rest 
from a; 
+0

或者正則表達式serde。 –

0

謝謝你的回答,它對我非常有幫助。

我選擇了第三個選項,我修改了一下,因爲它似乎字段6到無窮大(當然不是真的無限)沒有正確插入最後一列。事實上,只有場6被插入到視圖「b」中。

我在同一個字符串中將字段6連接到Infinity,但用管道字符「|」分隔。 這裏是修改後的代碼:

create view b as 
select 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 1) as col1, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 2) as col2, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 3) as col3, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 4) as col4, 
regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)', 5) as col5, 
regexp_replace(regexp_extract(line, '([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;([^\;]*)\;(.*)', 6), '\;', '|') as rest 
from a;
相關問題