如何在Apache Pig中对多个展平列进行分组

0 hadoop apache-pig

我有3种不同模式的数据:

(1, 12, 43) 
(1, 6, 20) 
(2, 8, 43) 
(2, 5, 13)`
Run Code Online (Sandbox Code Playgroud)

我尝试将$ 0分组,我输出为

(1, {(1,12,43), (1,6,20)})
(2, {(2,8,43), (2,5,13)}
Run Code Online (Sandbox Code Playgroud)

我们怎么能产生像,

(1, {12,6}, {43,20}) 
(2, {8,5}, {43,13})
Run Code Online (Sandbox Code Playgroud)

Bal*_*duz 6

为此你需要一个嵌套的foreach:

A = LOAD 'your_data' using PigStorage(',');
B = group A by $0;
C = foreach B {
    AUX = foreach A generate $1,$2;
    generate group, AUX;
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

(1,{(6,20),(12,43)})
(2,{(5,13),(8,43)})
Run Code Online (Sandbox Code Playgroud)

您在嵌套foreach中需要AUX关系的原因是默认情况下,当您在Pig中进行分组时,它还包括您在分组包内分组的字段,因此您需要两次.这就是你在分组时发生的事情$0.您需要嵌套的foreach来删除不需要的值.

希望有所帮助!

编辑

如果您希望每列都转到相同的元组,请尝试以下方法:

A = LOAD 'your_data' using PigStorage(',');
B = group A by $0;
C = foreach B generate $0, BagToTuple($1.$1), BagToTuple($1.$2);
Run Code Online (Sandbox Code Playgroud)

这将产生:

(1,(6,12),(20,43))
(2,(5,8),(13,43))
Run Code Online (Sandbox Code Playgroud)

如果您需要将每个组放在包中而不是元组中,请使用以下TOBAG函数:

C = foreach B generate $0, TOBAG(BagToTuple($1.$1)), TOBAG(BagToTuple($1.$2));
Run Code Online (Sandbox Code Playgroud)

这会产生:

(1,{(6,12)},{(20,43)})
(2,{(5,8)},{(13,43)})
Run Code Online (Sandbox Code Playgroud)

但是,你永远不会有一个没有元组的包,因为一个包只是一组元组.因此,猪不可能完全满足你的要求:

(1,{6,12},{20,43})
(2,{5,8},{13,43})
Run Code Online (Sandbox Code Playgroud)

您将需要使用带有元组的元组或包.