我是Trident的新手,我想创建一个类似于'Sum()的'Average'聚合器,但是'Average'。以下不起作用:
public class Average implements CombinerAggregator<Long>.......{
public Long init(TridentTuple tuple)
{
(Long)tuple.getValue(0);
}
public Long Combine(long val1,long val2){
return val1+val2/2;
}
public Long zero(){
return 0L;
}
}
它可能在语法上并不完全正确,但这就是想法。如果可以的话请帮忙。给定2个具有值[2,4,1]和[2,2,5]的元组以及字段“a”,“b”和“c”并且在字段“b”上执行平均值应返回“3”。我不完全确定init()和zero()是如何工作的。
非常感谢您的帮助。
利
答案 0 :(得分:1)
public class Average implements CombinerAggregator<Number> {
int count = 0;
double sum = 0;
@Override
public Double init(final TridentTuple tuple) {
this.count++;
if (!(tuple.getValue(0) instanceof Double)) {
double d = ((Number) tuple.getValue(0)).doubleValue();
this.sum += d;
return d;
}
this.sum += (Double) tuple.getValue(0);
return (Double) tuple.getValue(0);
}
@Override
public Double combine(final Number val1, final Number val2) {
return this.sum / this.count;
}
@Override
public Double zero() {
this.sum = 0;
this.count = 0;
return 0D;
}
}
答案 1 :(得分:0)
对于Trident来说,我是一个完整的新手,所以如果下面的内容有效的话,我并不完全。但它可能会:
public class AvgAgg extends BaseAggregator<AvgState> {
static class AvgState {
long count = 0;
long total = 0;
double getAverage() {
return total/count;
}
}
public AvgState init(Object batchId, TridentCollector collector) {
return new AvgState();
}
public void aggregate(AvgState state, TridentTuple tuple, TridentCollector collector) {
state.count++;
state.total++;
}
public void complete(AvgState state, TridentCollector collector) {
collector.emit(new Values(state.getAverage()));
}
}