我有三种不同的模式:
(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})
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来删除不需要的值。希望有帮助!编辑如果希望每列都指向同一元组,请尝试以下操作:
$0
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 功能:
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})
您需要使用元组或带元组的包。
1条答案
按热度按时间pgccezyw1#
为此,您需要一个嵌套的foreach:
这将产生以下输出:
在嵌套foreach中需要aux关系的原因是,默认情况下,在pig中分组时,它还包括分组包中要按其分组的字段,因此有两次。这就是你分组时发生的事情
$0
. 您需要嵌套的foreach来删除不需要的值。希望有帮助!
编辑
如果希望每列都指向同一元组,请尝试以下操作:
这将产生:
如果需要每个组都位于一个包而不是元组中,请使用
TOBAG
功能:这将产生:
然而,你永远不能没有元组的包,因为包只是一组元组。因此,不可能完全按照您的要求:
您需要使用元组或带元组的包。