在 Google Cloud Dataflow 中一次应用多个聚合
Applying multiple aggregations at once in Google Cloud Dataflow
我有一个 PCollection
键值对,其中值为 Double。
我需要计算值的总数及其平均值。
我看到有两个转换 - Count
和 Mean
。但是我找不到在 GroupBy 操作中同时应用它们的方法。
看来我的选择是要么实现我自己的组合方法来实现计数和平均,要么分别应用计数和均值,然后将它们连接到原始键上。
还有第三种方法吗?
谢谢,
G
我会说正确的方法是编写自己的 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()));
我有一个 PCollection
键值对,其中值为 Double。
我需要计算值的总数及其平均值。
我看到有两个转换 - Count
和 Mean
。但是我找不到在 GroupBy 操作中同时应用它们的方法。
看来我的选择是要么实现我自己的组合方法来实现计数和平均,要么分别应用计数和均值,然后将它们连接到原始键上。
还有第三种方法吗?
谢谢, G
我会说正确的方法是编写自己的 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()));