我有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
进行操作。
答案 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());
}
}