我想实现一个加载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 -> g2
至PCollection<A> a2
来自a1
和a2
的新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());
}
}
}
答案 0 :(得分:-1)
Combine函数执行诸如Sum,Min,Max和Mean的基本功能。对于specific combine功能,您需要提供一些处理逻辑。因此,目前没有内置功能可以做到这一点。