0

和 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

所以基本上按 ID 分组,然后展平其余列并将其作为每一行输出。

PIG 甚至是正确的方法吗?我有办法在 M/R 中做到这一点,但我认为 Pig 可能是这类事情的理想选择。

非常感谢您提供的任何提示

邓肯

PS我不关心值的顺序。

4

1 回答 1

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;
于 2013-04-18T02:37:47.123 回答