簡體   English   中英

使用 insertAll 流式傳輸時 BigQuery 中的“復合鍵”

[英]“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_idmodified_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM