2017-03-03 57 views
0

嗨按KV Pcollection上的鍵執行組後,我需要: - 1)使該PCollection中的每個元素成爲單獨的獨立PCollection。 2)將這些單獨的PCollections中的記錄插入到BigQuery表中。 基本上我的意圖是在BigQuery表中創建一個動態日期分區。 我該怎麼做? 一個例子真的有幫助。分割KV <K,V> PCollection分成多個PCollections

+0

到目前爲止,您嘗試了什麼? –

+0

我試過分區,但無法生成它們的PCollections,我可以使用側輸出,但因爲我們必須預先聲明元組標記,所以我不考慮這樣做,因爲根據數據源中的數據量和記錄的日期,可以有N個元組標籤。 – rish0097

+0

具體而言,假設我有一個文件有內容: 1 ABC 1991-07-18 2 DEF 1992-08-15 3 FGH 2015-01-01 4 IJK 2016-03-10 5 XYZ 1992-08-15 我想通過使用數據流在每個不同的日期創建動態分區,將這些數據放入BigQuery表中。 – rish0097

回答

0

對於Google Dataflow能夠執行大規模並行化(作爲公共雲上的服務),作業流程需要在提交到Google雲端控制檯之前進行預定義。每次執行包含管道選項和變換的jar文件時,都會創建一個帶有作業描述的json文件並將其提交到Google雲平臺。託管服務然後使用它來執行您的工作。

對於問題中提到的用例,它要求將輸入PCollection拆分爲儘可能多的PCollection,因爲它們是唯一的日期。對於拆分,需要動態創建拆分集合所需的元組標籤,這在目前是不可能的。動態創建元組標籤是不允許的,因爲這無助於創建作業描述文件,並且勝過構建數據流的整個設計/目的。

我能想到的幾個解決方案,對這個問題(兩者都具有其自身的優點和缺點):

解決方案1(對於確切的使用情況下,問題的解決方法):

寫數據流轉換,是以輸入PCollection和輸入中的每個元素 -

1. Checks the date of the element. 
2. Appends the date to a pre-defined Big Query Table Name as a decorator (in the format yyyyMMDD). 
3. Makes an HTTP request to the BQ API to insert the row into the table with the table name added with a decorator. 

你將不得不考慮這一做法,因爲t時的成本角度這裏是針對每個元素的單個HTTP請求,而不是BQ加載作業,如果我們使用了BigQueryIO數據流sdk模塊,就可以做到這一點。

解決方案2(應該遵循這些類型的用例的最佳實踐):

1. Run the dataflow pipeline in the streaming mode instead of batch mode. 
2. Define a time window with whatever is suitable to the scenario in which it is being is used. 
3. For the `PCollection` in each window, write it to a BQ table with the decorator being the date of the time window itself. 

你將不得不考慮重新構建數據源將數據發送到數據流的實時,但你將有一個動態的日期分區大查詢表,其數據處理結果接近實時。

參考 -

  1. Google Big Query Table Decorators
  2. Google Big Query Table insert using HTTP POST request
  3. How job description files work

注:請提意見,如果需要,我會闡述了答案的代碼片段。

+0

感謝您的回覆@paritosh ...將嘗試使用第一個選項來實現...第二個選項是不成問題的,因爲無法在流模式下運行管道... 但是,如果您遇到任何其他方式這請允許我知道或者如果我確實會確保發佈它... – rish0097

+0

Sure @ rish0097 :) –