我想知道谷歌的數據流是否可以做一些事情,就等於像SQL得到PCollection的任意第一N值在谷歌數據流
SELECT * FROM A INNER JOIN B ON A.a = B.b **LIMIT 1000**
我知道,數據流具有非常標準的編程範式做加盟。但是,我感興趣的部分是LIMIT 1000
。因爲我不需要所有的加入結果,但只有1000個。我想知道我是否可以利用這個用例來加速我的工作(假設加入是在非常廣泛的表格之間,並且會在完全加入時產生非常大的結果)
因此,我假設一種非常天真的方式來實現上面的SQL結果是一些模板代碼如下:
PCollection A = ...
PCollection B = ...
PCollection result = KeyedPCollectionTuple.of(ATag, A).and(BTag, B)
.apply(CoGroupByKey.create())
.apply(ParDo.of(new DoFn<KV<...,CoGbkResult>, ...>() {
})
.apply(Sample.any(1000))
但是我擔心的是,這是怎麼Sample
轉型與ParDo
掛鉤內部由數據流處理。數據流能夠以它停止處理連接的方式進行優化,只要它知道它肯定會有足夠的輸出。或者在這種用例中沒有優化,數據流只會計算完整的連接結果,然後從結果中選擇1000? (這樣,Sample
轉換隻會是一個開銷)
或者長問題簡短,我有可能利用這個用例在數據流中做部分連接嗎?
編輯: 從本質上講,我想知道Sample.any()
轉換將能夠提示任何優化上游PCollection?例如,如果我這樣做
pipeline.apply(TextTO.Read.from("gs://path/to/my/file*"))
.apply(Sample.any(N))
將數據流第一次加載中的所有數據,然後選擇N或將它能夠利用的Sample.any()
和做一些優化,並修剪掉一些無用的閱讀。
'Sample.any'的文檔特別指出它不是並行執行的。所以我們猜測它估計了需要處理連接的「PCollection」分片數以獲得1000行,並且繼續按照更多的分片繼續處理,直到它實際上有1000個分支。 – Gene