如何在 Apache Pig 中对多个展平列进行分组
How to group a multiple flatten columns in Apache Pig
我有 3 种不同模式的数据:
(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})
为此,您将需要一个嵌套的 foreach:
A = LOAD 'your_data' using PigStorage(',');
B = group A by [=10=];
C = foreach B {
AUX = foreach A generate ,;
generate group, AUX;
}
给出以下输出:
(1,{(6,20),(12,43)})
(2,{(5,13),(8,43)})
在嵌套的 foreach 中需要 AUX 关系的原因是默认情况下,当您在 Pig 中分组时,它也会在分组包中包含您分组依据的字段,因此您有两次。这就是您按 [=17=]
分组时发生的情况。您需要嵌套的 foreach 来删除不需要的值。
希望对您有所帮助!
编辑
如果您希望每列转到同一个元组,请尝试这样做:
A = LOAD 'your_data' using PigStorage(',');
B = group A by [=12=];
C = foreach B generate [=12=], BagToTuple(.), BagToTuple(.);
这将生成:
(1,(6,12),(20,43))
(2,(5,8),(13,43))
如果您需要将每个组放在一个包而不是一个元组中,请使用 TOBAG
函数:
C = foreach B generate [=14=], TOBAG(BagToTuple(.)), TOBAG(BagToTuple(.));
这将生成:
(1,{(6,12)},{(20,43)})
(2,{(5,8)},{(13,43)})
但是,你永远不可能拥有没有元组的包,因为包就是一组元组。因此,Pig 中不可能完全符合您的要求:
(1,{6,12},{20,43})
(2,{5,8},{13,43})
您将需要使用元组或带有元组的包。
我有 3 种不同模式的数据:
(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})
为此,您将需要一个嵌套的 foreach:
A = LOAD 'your_data' using PigStorage(',');
B = group A by [=10=];
C = foreach B {
AUX = foreach A generate ,;
generate group, AUX;
}
给出以下输出:
(1,{(6,20),(12,43)})
(2,{(5,13),(8,43)})
在嵌套的 foreach 中需要 AUX 关系的原因是默认情况下,当您在 Pig 中分组时,它也会在分组包中包含您分组依据的字段,因此您有两次。这就是您按 [=17=]
分组时发生的情况。您需要嵌套的 foreach 来删除不需要的值。
希望对您有所帮助!
编辑
如果您希望每列转到同一个元组,请尝试这样做:
A = LOAD 'your_data' using PigStorage(',');
B = group A by [=12=];
C = foreach B generate [=12=], BagToTuple(.), BagToTuple(.);
这将生成:
(1,(6,12),(20,43))
(2,(5,8),(13,43))
如果您需要将每个组放在一个包而不是一个元组中,请使用 TOBAG
函数:
C = foreach B generate [=14=], TOBAG(BagToTuple(.)), TOBAG(BagToTuple(.));
这将生成:
(1,{(6,12)},{(20,43)})
(2,{(5,8)},{(13,43)})
但是,你永远不可能拥有没有元组的包,因为包就是一组元组。因此,Pig 中不可能完全符合您的要求:
(1,{6,12},{20,43})
(2,{5,8},{13,43})
您将需要使用元组或带有元组的包。