繁体   English   中英

如何根据 PCollection 的大小编写 Beam 条件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM