2017-07-12 75 views
1

基本上,我們希望基於特定列的值(而不是日期)將大型(數十億行)bigquery表拆分爲大量(可能大約爲100k)較小的表。我無法弄清楚如何在bigquery中有效地執行它,所以我正在考慮使用數據流。使用數據流,我們可以先加載數據,然後爲每條記錄創建一個鍵值對,關鍵是我們想要拆分表的特定列的所有可能值,然後我們可以通過將記錄組合鑰匙。所以在這個操作之後,我們有(密鑰,[記錄])的PCollection。那麼我們需要將PCollection寫回到bigquery表中,表名可以是key_table。數據流中的動態bigquery表名

所以操作將是:p | beam.io.Read(beam.io.BigQuerySource())| beam.map(lambda記錄:(record ['splitcol'],record))| beam.GroupByKey()| beam.io.Write(beam.io.BigQuerySink)

現在的關鍵問題是如何根據PCollection中每個元素的值在最後一步寫入不同的表。

這個問題是以某種方式與另一個問題相關: Writing different values to different BigQuery tables in Apache Beam。但我是一個Python的傢伙,不知道在Python SDK中是否也可能有相同的解決方案。

回答

0

目前此功能(值取決於BigQueryIO.write())僅在Beam Java中受支持。不幸的是,我想不出一種簡單的方法來使用Beam Python來模擬它,而不是重新實現相應的Java代碼。請隨時打開JIRA功能請求。

我猜想最簡單的事情是寫一個DoFn手動將行寫入各自的表,使用BigQuery streaming insert API(而不是Beam BigQuery連接器),但請記住,流式插入代價更高,受制於比批量導入更嚴格的配額策略(在編寫有界的PCollection時由Java BigQuery連接器使用)。

在Beam中也有一些工作可以在各種語言中重複使用變換 - 正在討論的設計是https://s.apache.org/beam-mixed-language-pipelines。完成該工作後,您將能夠使用Python管道中的Java BigQuery連接器。

+0

很棒的信息。感謝您的建議 –