使用Pig,我的输入文件是:
1,4,6
1,2,7,9
2,5,1
1,3,5,1
2,6,2,8
每行的第一个值是ID;行的其余部分只是唯一值(每行可以有不同数量的列)。
我想将上述内容转换为:
1,2,4,6,7,9,3,5,1
2,5,1,6,2,8
所以基本上是GROUP by ID,然后将其余的列展平并输出每行。
PIG甚至是正确的方法吗?我有办法在M / R中做到这一点,但认为Pig可能是这种事情的理想选择。
非常感谢提供的任何提示
邓肯
PS我不关心值的顺序。
答案 0 :(得分:2)
未经测试,但这是我采取的一般方法:获取一个包含ID和一包值的变量,将其展平,以便获得只有id和单个值的行,取不同的行,然后按ID。这将为每个ID提供一个值,如果您想输出,可以转换为字符串。
A = LOAD 'input' USING TextLoader() as line:chararray;
B = FOREACH A GENERATE STRSPLIT(line,',',2) as (id:chararray,values:chararray)
C = FOREACH B GENERATE id, FLATTEN(TOBAG(STRSPLIT(values,','))) as value:chararray;
D = DISTINCT C; -- I'm assuming you actually want distinct values, wasn't clear.
E = GROUP D by id;
F = FOREACH E GENERATE group as id, BagToString(D.value) as valueString:chararray;