如何在ApachePig中对多个扁平列进行分组

s3fp2yjn  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(274)

我有三种不同的模式:

(1, 12, 43) 
(1, 6, 20) 
(2, 8, 43) 
(2, 5, 13)`

我试着用0美元分组,结果得到了输出

(1, {(1,12,43), (1,6,20)})
(2, {(2,8,43), (2,5,13)}

我们怎样才能产生,

(1, {12,6}, {43,20}) 
(2, {8,5}, {43,13})
pgccezyw

pgccezyw1#

为此,您需要一个嵌套的foreach:

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

这将产生以下输出:

(1,{(6,20),(12,43)})
(2,{(5,13),(8,43)})

在嵌套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);

这将产生:

(1,(6,12),(20,43))
(2,(5,8),(13,43))

如果需要每个组都位于一个包而不是元组中,请使用 TOBAG 功能:

C = foreach B generate $0, TOBAG(BagToTuple($1.$1)), TOBAG(BagToTuple($1.$2));

这将产生:

(1,{(6,12)},{(20,43)})
(2,{(5,8)},{(13,43)})

然而,你永远不能没有元组的包,因为包只是一组元组。因此,不可能完全按照您的要求:

(1,{6,12},{20,43})
(2,{5,8},{13,43})

您需要使用元组或带元组的包。

相关问题