![](/img/trans.png)
[英]How to insert 38000 records in BigQuery using streaming insertAll?
[英]“composite key” in BigQuery when streaming with insertAll
我將數據流式傳輸到構建InsertAllRequest
的 BigQuery 表中,然后使用insertAll
中的com.google.cloud.bigquery.BigQuery
方法插入該表。 我 git 這一切都可以在我可以將數據插入表中的意義上工作,但我不適合特定行為:我想在表中實現某種“復合鍵”。
表格如下所示:
Field name | Type | Mode
--------------------------------------
order_id | STRING | REQUIRED
modified_ts | TIMESTAMP | REQUIRED
order_sum | INTEGER | NULLABLE
order_reference | STRING | NULLABLE
所以,我希望關鍵是order_id
和modified_ts
; 換句話說,我希望能夠跟蹤訂單隨時間的變化。 如果再次插入現有密鑰,我希望出現一些錯誤 - 或者只是忽略這個新行(將其視為重復)對我來說也可以正常工作。
不幸的是,我還沒有成功地告訴 BigQuery 這樣做。 這是我測試的代碼:
String rowId = String.valueOf("order_id, modified_ts");
InsertAllRequest req = InsertAllRequest.newBuilder(ORDER)
.addRow(rowId, mapOrder(o, modifiedTs))
.build();
InsertAllResponse resp = bigQuery.insertAll(req);
log.info("response was: {}", resp.toString());
newBuilder
中的 ORDER 是一個TableId
,而mapOrder(o, modifiedTs)
將傳入的 object 映射到一個Map<String, Object>
。 如果我將rowId
定義為String.valueOf("order_id")
則一切正常,但顯然訂單的所有更新只是更新現有行,而不生成任何歷史記錄。 上面使用逗號分隔的列名的解決方案的行為方式相同,只是忽略了modified_ts
。
所以,我的問題很簡單:我怎樣才能讓它工作? 我想要的是 - 有點簡化 - 以下內容:
order_id | modified_ts | data
------------------------------------------
1 | 2020-12-10 | some data
1 | 2020-12-15 | some changed data
2 | 2020-12-15 | some more data
BigQuery 中不存在復合鍵或 UNIQUE 概念。 沒有鍵和索引。
設計您的應用程序,以便允許插入重復項。
在您的表格頂部創建一個視圖,該視圖根據您已經布置的概念讀取記錄的最新行。
這樣,您也可以訪問版本化數據,並且始終使用查詢中的 view as from 子句獲得最新版本。
正如對 Pentium 10 答案的評論中所寫,與 Google 代表的一次會議證實了其內容。
基本上,我誤解了向我的行添加“rowId”的功能,表明它的鍵: String rowId = String.valueOf("order_id, modified_ts");
這只不過是 Google 所說的“盡力而為的重復數據刪除” ,它就是這樣 - 盡力而為,但沒有任何保證。 我誤以為這是一種可以依賴的技術,我的錯。
處理此問題的推薦方法是在您自己的代碼中,在流式傳輸到 BigQuery 之前或之后。 “之前”意味着在將數據寫入 BQ 之前在您的應用程序中處理重復項中實現邏輯,其中包括將您標識為 memory 中的鍵的某些方法。 Pentium 10 建議“之后”:stream 將所有數據放入 BigQuery 並將其持久化,然后處理 rest。
有 3 種“之后”解決這個問題的方法: 帶有(非常方便的)窗口函數的視圖可能是一種方法(但請記住,每次查詢視圖時都需要整個底層查詢的處理能力),物化視圖可能是一種解決方案(如果/當谷歌支持 window 函數)或者您自己創建和更新具有所需數據的表。 管理一些調度之王。
我希望這個答案有助於澄清一些事情,並作為對所提供答案的補充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.