评估整个PCollection的功能

时间:2018-03-12 07:03:05

标签: apache-beam

我有PCollection<V>我想基本上评估一个函数f(List<V>)。我可以制作一个CombineFn看起来像:

class GlobalCombineFn extends Combine.CombineFn<Write, List<Write>, Void> {
    @Override
    public List<Write> createAccumulator() {
        return new ArrayList<>();
    }

    @Override
    public List<Write> addInput(List<Write> accumulator, Write input) {
        accumulator.add(input);
        return accumulator;
    }

    @Override
    public List<Write> mergeAccumulators(Iterable<List<Write>> accumulators) {
        List<Write> result = createAccumulator();
        accumulators.forEach(result::addAll);
        return result;
    }

    @Override
    public Void extractOutput(List<Write> accumulator) {
        f(accumulator);
        return null;
    }
}

然而,这有点愚蠢和很多样板。有内置的方法吗?

我也尝试使用View.asIterable() / View.asList()但是没有办法对PCollectionView进行操作。

1 个答案:

答案 0 :(得分:0)

我最后只是编写了自己的PTransform,这简单了:

public class ReduceToIterable<T> extends PTransform<PCollection<T>, PCollection<Iterable<T>>> {
    @Override
    public PCollection<Iterable<T>> expand(PCollection<T> input) {
        return input.apply(WithKeys.of((Void) null))
                .setCoder(KvCoder.of(VoidCoder.of(), input.getCoder()))
                .apply(GroupByKey.create())
                .apply(Values.create());
    }
}