GroupBy上的循环 - 级联中的聚合

时间:2016-02-20 21:32:27

标签: cascading

当GroupBy上的聚合应用于任何管道时,结果字段具有分组键&汇总价值。 除了级联

中的汇总值之外,我还想要所有字段

示例:     输入:

       A|a1|b1|12
       B|b2|c2|10
       A|a3|a3|5

正常汇总输出:

A|17
B|10

我想要:输出与输入相同,但另外还有聚合列 -

A|a1|b1|12|17
B|b2|c2|10
A|a3|a3|5|17

那么,如何循环使用GroupBY的结果进行聚合&在Cascading中打印所有行?

    Pipe group = new GroupBy(someTuplePipe, groupKey, true);
    group  = new Every(g1, Fields.ALL, new Count(new Fields("sum")), Fields.ALL);

1 个答案:

答案 0 :(得分:2)

我找到的最好方法是创建自定义Buffer并使用List保存传入的TupleEntry计算总和,并通过迭代上一个保存的列表来写出总和

@Override
public void operate(FlowProcess flowProcess, BufferCall bufferCall) {
    Iterator<TupleEntry> iterator = bufferCall.getArgumentsIterator();
    List<TupleEntry> tupleEntryMap = new ArrayList<TupleEntry>();

    int sum = 0;
    while (iterator.hasNext()) {
        TupleEntry inputEntry = new TupleEntry(iterator.next());
        sum += inputEntry.getInteger("amount_field");
        tupleEntryMap.add(inputEntry);
    }

    for (TupleEntry result : tupleEntryMap) {
        result.setInteger("amount_field", sum);
        bufferCall.getOutputCollector().add(result);
    }
} 

如上所述使用它。

Pipe group = new GroupBy(someTuplePipe, groupKey, true);
group  = new Every(group, new CustomBuffer(), Fields.REPLACE);