当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);
答案 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);