PIG(Hadoop)-具有可变列的行

PIG(Hadoop)-具有可变列的行,hadoop,apache-pig,Hadoop,Apache Pig,玩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分组,然后展平其余的列并将其作为每行输出 猪在这里是正确的方法吗?我有办法在M/R中做到这一点,但我认为Pig可能是这类事情的理想选择 非常感谢您提供的任何提示 邓肯 PS我不关心值的顺序。未经测试,但这里是我将采取的一

玩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分组,然后展平其余的列并将其作为每行输出

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

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

邓肯


PS我不关心值的顺序。

未经测试,但这里是我将采取的一般方法:获取一个包含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;

您可能应该将其表示为一个数据包(基本上是一个列表),然后可以对其执行任何您喜欢的操作。