![](/img/trans.png)
[英]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.