[英]How does a Beam runner determine the size of each bundle of a PCollection
[英]How to write a Beam condition based on the size of a PCollection
我有一个包含许多 MyResult 对象的 PCollection。
PCollection<MyResult> myResultCollection = ....
我想检查这个 PCollection,如果它为空,则在其中插入一个虚拟 MyResult 对象。
我知道 Count.Globally() 可以用来计算这个 PCollection 的大小。 它返回单个 LONG 值的 PCollection。
但是,我不知道如何从 PCollection 中提取长值(可能不允许),以便我可以执行以下操作:
// Psudo-Code
PCollection<MyResult> myResultCollection = ....
PCollection<Long> sizeCollection = myResultCollection.apply(Count.globally());
Long size = sizeCollection.getValue() // I know this method does not exist
if(size == 0) {
myResultCollection.add(new MyResult());
}
return myResultCollection;
编辑:
我试图实现@Louis 建议的想法,如下所示:
public class MyDummyGeneration extends SimpleFunction<Long, MyClass> {
public MyClass apply(final Long resultCount) {
if(resultCount == 0) {
return MyUtils.createDummyMyClass();
} else {
return null; // This caused exception
}
}
}
public class MyClassPostProcessingTransform extends PTransform<PCollection<MyClass>, PCollection<MyClass>> {
public PCollection<MyClass> expand(final PCollection<MyClass> input) {
var count = input.apply(Count.globally());
var dummyPCollection = count.apply(MapElements.via(new MyDummyGeneration()));
var collections = PCollectionList.of(diffResult).and(dummyPCollection);
return collections.apply(Flattern.pCollections());
}
}
return null;
导致异常,因为它是不允许的。 我不知道如何表示如果长度不为零的逻辑,我不希望 PCollection 包含任何元素。
我想澄清一件大事:当您编写 Beam 管道时,所有计算都会被延迟。 这就是sizeCollection.getValue()
不存在的原因,因为这意味着启动管道的主程序和正在运行的管道之间的同步。
第二件事是我们应该从您的端到端需求开始,以便了解如何做到最好。 PCollection 中可能为空或不为空的数据来自哪里? 你打算在它的下游做什么?
几个例子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.