Apache Pig:将属性列表合并为一个元组

时间:2012-12-07 07:27:56

标签: apache-pig

我收到

格式的数据
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,TOKENIZE,GENERATE,TOTUPLE,BagConcat等的所有组合按摩它到我想要的形式,但我是猪的新手,只是想不出来。有人可以帮忙吗?任何开源UDF库都是公平的游戏。

1 个答案:

答案 0 :(得分: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))