0

私はトライデントの初心者で、「Sum()」に似た「平均」アグリゲーターを作成しようとしていますが、「平均」用です。次は機能しません。

       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,4,1] および [2,2,5] とフィールド 'a'、'b' および 'c' を持つ 2 つのタプルが与えられ、フィールド 'b' で平均を実行すると、'3' が返されます。init() と zero() がどのように機能するかは完全にはわかりません。

よろしくお願いいたします。

エリ

4

2 に答える 2

0

私はトライデントに関しても完全な初心者なので、次のことがうまくいくかどうかは完全ではありません. しかし、次の可能性があります。

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()));
    }
}
于 2013-10-30T18:53:55.483 に答える