2014-10-31 60 views
1

我有以下的結構發生了巨大的數據集導入複雜的數據結構與自定義分隔

FIELDA,fieldB,fieldC; fieldD | fieldE,FieldF; fieldG | fieldH,FieldI ...

哪裏:

FIELDA,fieldB和fieldC是應該被導入到單獨的列

fieldD | fieldE,FieldF; fieldG | fieldH,FieldI是一個數組映射(元素通過分開的(由分號分隔的元素)| )的數組(元素用逗號分隔, 。G。 fieldE,FieldF)

我的問題是,初始數組與字段A,字段B,字段C用分號隔開。我的問題是如何在創建表格時正確設置分隔符。

此人不承認一個數組 - 儘管我提供了一個分號作爲字段分隔

CREATE TABLE string_array(
    first_part STRING # this would be to store fieldA,fieldB,fieldC 
    ,second_part ARRAY<STRING> # this would be to store fieldD|fieldE,FieldF;fieldG|fieldH,FieldI and split it by semicolon 
     ) 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\\u003b' 
    COLLECTION ITEMS TERMINATED BY '\\u003b' 
    MAP KEYS TERMINATED BY '|' 
STORED AS TEXTFILE; 

LOAD DATA LOCAL INPATH '...' INTO TABLE string_array; 

任何想法如何使它工作,所以我可以建立在它?提前感謝!

回答

1

偉大的問題。

我認爲我們可以將這個問題分成兩個獨立的部分:(1)Hive表結構和(2)數據分隔符。

讓我們先看一下Hive表結構。如果我理解正確的數據結構(請糾正我,如果我沒有),將最能描述你的數據表結構可以表示爲:

CREATE TABLE string_array 
AS 
SELECT 'fieldA,fieldB,fieldC' AS first_part, array(map('fieldD', array('fieldE', 'FieldF')), map('fieldG', array('fieldH','FieldI'))) AS second_part; 

注意,場SECOND_PART是地圖的數組,每個映射的關鍵字引用一個字符串數組。換句話說,字段second_part由數組內的映射內的數組組成。

如果我使用上面的語句創建表,我可以將生成的表複製到本地文件系統,並查看Hive如何爲其分配默認分隔符。我知道你不想使用默認分隔符,但請在這裏忍受。結果表看起來像這樣在其系列化磁盤上表示:

00000000 66 69 65 6c 64 41 2c 66 69 65 6c 64 42 2c 66 69 |fieldA,fieldB,fi| 
00000010 65 6c 64 43 01 66 69 65 6c 64 44 04 66 69 65 6c |eldC.fieldD.fiel| 
00000020 64 45 05 46 69 65 6c 64 46 02 66 69 65 6c 64 47 |dE.FieldF.fieldG| 
00000030 04 66 69 65 6c 64 48 05 46 69 65 6c 64 49 0a  |.fieldH.FieldI.| 

如果我們看一下蜂巢如何看待定界符我們注意到,蜂巢實際看到五種類型或層次分隔符:

delimiter 1 = x'01' (between fieldC & fieldD) -- between first_part and second_part 
delimiter 2 = x'02' (between fieldF & fieldG) -- between the two maps in the array of maps 
delimiter 3 = x'03' not used 
delimiter 4 = x'04' (between fieldD & fieldE) -- between the key and the array of fields within the map 
delimiter 5 = x'05' (between fieldE & fieldF) -- between the fields within the array within the map 

而這裏存在你的問題。當前版本的Hive(as of 0.11.0)僅允許您覆蓋三個分隔符級別。但由於數據中的嵌套級別,Hive發現要求分隔符超過三級。

我的建議是預先處理您的數據以使用Hive的默認分隔符。使用這種方法,您應該能夠將數據加載到Hive中並引用它。

+0

非常感謝。我希望能夠導入數據,因爲預處理需要很多時間。但是,如果它不可避免,那麼必須做... – 2014-11-07 10:22:44