2012-12-07 27 views
3

我的形式接收數據Apache的豬:合併屬性列表插入一個元組

id1|attribute1a,attribute1b|attribute2a|attribute3a,attribute3b,attribute3c.... 
id2||attribute2b,attribute2c|.. 

我想這一切融合成一種形式,我只是有一個ID字段的元組的包後面是一個包含所有其他字段的列表的合併在一起的元組。

(ID1,(attribute1a,attribute1b,attribute2a,attribute3a,attribute3b,attribute3c ...)) (ID2,(attribute2b,attribute2c ...))

目前我取它像

my_data = load '$input' USING PigStorage(|) as 
(id:chararray, attribute1:chararray, attribute2:chararray)... 

然後我試過FLATTEN,記號化,生成,TOTUPLE,BagConcat等的所有組合,以按摩到我想要的形式,但我是新來的豬,只是無法弄清楚。誰能幫忙?任何開源的UDF庫都是公平的遊戲。

回答

2

負載每條線作爲一個完整的字符串,然後使用的特徵的內置STRPLIT UDF以實現期望的結果。這依賴於有是在你的屬性列表中沒有任何標籤,並假定|,不被任何區別在分離出不同屬性的處理。另外,我修改了一些輸入以顯示更多邊緣情況。

input.txt

id1|attribute1a,attribute1b|attribute2a|,|attribute3a,attribute3b,attribute3c 
id2||attribute2b,attribute2c,|attribute4a|,attribute5a 

test.pig

my_data = LOAD '$input' AS (str:chararray); 
split1 = FOREACH my_data GENERATE FLATTEN(STRSPLIT(str, '\\|', 2)) AS (id:chararray, attr:chararray); 
split2 = FOREACH split1 GENERATE id, STRSPLIT(attr, '[,|]') AS attributes; 
DUMP split2; 

pig -x local -p input=input.txt test.pig輸出:

(id1,(attribute1a,attribute1b,attribute2a,,,attribute3a,attribute3b,attribute3c)) 
(id2,(,attribute2b,attribute2c,,attribute4a,,attribute5a)) 
+0

感謝您的幫助。 – Manny