我收到
格式的数据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库都是公平的游戏。
答案 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))