3

我收到表格中的数据

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 库都是公平的游戏。

4

1 回答 1

2

将每一行作为一个完整的字符串加载,然后使用内置STRPLITUDF 的特性来达到预期的结果。这依赖于您的属性列表中没有选项卡,并假设|,分离不同属性时不会有任何不同的处理。此外,我稍微修改了您的输入以显示更多边缘情况。

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))
于 2012-12-07T16:24:31.897 回答