簡體   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