2015-05-04 35 views
0

我有一個鍵值對的PCollection,其中值爲Double。 我需要計算值的總數及其平均值。在Google Cloud Dataflow中一次應用多個聚合

我看到有兩個變換 - CountMean。但是我無法在GroupBy操作中找到同時應用它們的方法。

它看起來像我的選擇是要麼實現我自己的組合方法,將實現計數和平均,或分別應用計數和平均值,然後加入他們的原始密鑰。

有沒有第三種方法呢?

感謝, 摹

回答

0

我會說,這樣做的正確方法是寫自己的DOFN和GroupByKey改造後使用它:

static class CountAndMean extends DoFn<KV<String, Iterator<Double>>, String> { 
    @Override 
    public void processElement(ProcessContext c) { 
     long count = 0L; 
     double sum = 0.0; 
     for(Double v: c.element().getValue()){ 
      sum += v.doubleValue(); 
      count += 1L; 
     } 
     double mean = sum/count; 
     String out = c.element().getKey() + "," + String.valueOf(mean) + "," + String.valueOf(count); 
     c.output(out); 
    } 

PCollection<KV<String, Double>> inCol = ... ; 
PCollection<KV<String, Iterable<Double>>> perKeyCol = inCol.apply(GroupByKey.<String, Double>create()); 
PCollection<String> outCol = perKeyCol.apply(ParDo.named("CountAndMean").of(new CountAndMean())); 
+0

但不會計數操作返回1(因爲所有的鍵現在都是不同的)? –

+0

Oups,這裏的確是另一種基於GroupByKey的解決方案。 – Quentin

+0

謝謝 - 這也是我想到的。我希望我可以重複使用「Count」和「Mean」操作。 –

相關問題