数据流如何组合PCollections替换对象

时间:2018-06-14 09:40:46

标签: merge google-cloud-dataflow apache-beam dataflow

我想实现一个加载2种数据的过程,比如说A和B,PCollection<A> a1, PCollection<B> b1。然后我从a1创建一个View.asMap(),并将其作为dfn1上应用的sideinput提供给DoFn b1。该DoFn使用A类的一些值并输出它们。之后,我想创建一个新的PCollection<A> a2,其中包含a1的所有对象,但会替换dfn1输出的对象。

让我们说a1拥有对象o1, b1, c1, d1, e1, f1, g1 dfn1操纵并输出b1 -> b2, c1 -> c2, g1 -> g2PCollection<A> a2

来自a1a2的新PCollection应包含o1, b2, c2, e1, f1, g2

是否有内置机制来完成类似的事情?可以在&#34; merge&#34;之前键入集合。

提前致谢。

由于我对这个问题的英语解释不满意,这里有一个执行我要求的DoFn。真正的问题是,如果有一个内置的变换可以做这样的事情,那么最好不用手动创建一个视图。

public class CombineKvCollectionsWithMasterCollection extends DoFn<KV<String, Object>, Object>{
    private static final long serialVersionUID = 4100849850259729106L;

    private PCollectionView<Map<String, Object>> masterView;

    public CombineKvCollectionsWithMasterCollection(PCollectionView<Map<String, Object>> masterView) {
        this.masterView = masterView;
    }

    @ProcessElement
    public void processElement(ProcessContext c) {
        KV<String, Object> kv = c.element();
        Map<String, Object> masterMap = c.sideInput(masterView);
        if (masterMap.containsKey(kv.getKey())) {
            c.output(masterMap.get(kv.getKey()));
        } else {
            c.output(kv.getValue());
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

Combine函数执行诸如Sum,Min,Max和Mean的基本功能。对于specific combine功能,您需要提供一些处理逻辑。因此,目前没有内置功能可以做到这一点。