2016-12-23 49 views
0

我想知道谷歌的數據流是否可以做一些事情,就等於像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()和做一些優化,並修剪掉一些無用的閱讀。

+0

'Sample.any'的文檔特別指出它不是並行執行的。所以我們猜測它估計了需要處理連接的「PCollection」分片數以獲得1000行,並且繼續按照更多的分片繼續處理,直到它實際上有1000個分支。 – Gene

回答

1

目前,既無法使用Cloud Dataflow,也無法使用其他Apache Beam運行器(據我所知)實現了這種優化。

相關問題