首页 > 解决方案 > 数据流如何组合 PCollection 替换对象

问题描述

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

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

新的 PCollection 结合a1a2应该包含o1, b2, c2, e1, f1, g2

是否有内置机制来完成类似的事情?集合可以在“合并”之前键入。

提前致谢。

由于我对问题的英文解释不满意,这里有一个 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());
        }
    }
}

标签: mergegoogle-cloud-dataflowapache-beamdataflow

解决方案


Combine函数执行 Sum、Min、Max 和 Mean 等基本函数。对于特定的组合功能,您需要提供一些处理逻辑。所以,目前没有内置函数可以做到这一点。


推荐阅读