按多个字段分组并输出元组

时间:2013-06-19 08:33:56

标签: hadoop apache-pig

我有以下格式的Feed:

Hour Key  ID  Value
   1  K1 001      3
   1  K1 002      2
   2  K1 005      4
   1  K2 002      1
   2  K2 003      5
   2  K2 004      6

我希望按(Hour, Key)对Feed进行分组,然后对Value求和,但保留ID作为元组:

({1, K1}, {001, 002}, 5)
({2, K1}, {005}, 4)
({1, K2}, {002}, 1)
({2, K2}, {003, 004}, 11)

我知道如何使用FLATTEN生成Value的总和但不知道如何输出ID作为元组。这就是我到目前为止所做的:

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int);
B = GROUP A BY (Hour, Key);
C = FOREACH B GENERATE
    FLATTEN(group) AS (Hour, Key),
    SUM(A.Value) AS Value
;

你会解释怎么做吗?欣赏它!

1 个答案:

答案 0 :(得分:13)

您只需使用行李投影操作符.即可。这将创建一个新的包,其中元组只包含您指定的元素。在您的情况下,请使用A.ID。实际上,您已经使用此运算符向SUM提供输入 - sum的输入是一个单元素元组,您可以通过投影Value字段来创建。

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int);
B = GROUP A BY (Hour, Key);
C = FOREACH B GENERATE
    FLATTEN(group) AS (Hour, Key),
    A.ID,
    SUM(A.Value) AS Value
;