Storm Trident的平均聚合器

时间:2013-10-29 21:50:57

标签: apache-storm trident

我是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()是如何工作的。

非常感谢您的帮助。

2 个答案:

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