[英]Create table on data load in BiqQuery from Java
根據此處的文檔: https : //cloud.google.com/bigquery/docs/tables#creating_a_table_when_you_load_data,BigQuery應該可以根據數據創建表。
將數據加載到BigQuery中時,可以將數據加載到新表或分區中,可以將數據附加到現有表或分區中,或者可以覆蓋表或分區。 您無需在將數據加載到其中之前創建一個空表。 您可以創建新表並同時加載數據。
但是,每當我嘗試從Java將數據流傳輸到BigQuery時,我都會得到一個錯誤消息,表明我的表不存在。
這是一個插入語句的示例,該語句有效,但僅在我手動創建表之后:
InsertAllResponse response = bigQuery
.insertAll(
InsertAllRequest
.newBuilder(tableId)
.addRow(rowContent)
.build()
);
我可以用Java創建架構,然后創建表,但是隨后我必須不斷檢查架構是否已創建,然后才能流式傳輸到它。 generateBigQuerySchema
是我創建的定義模式的方法。 如果架構已經存在,則下面的代碼將失敗,因此在創建之前,我必須檢查它是否存在。
InsertAllResponse response = bigQuery
.create(requestLog.generateBigQuerySchema(tableId))
.getBigQuery()
.insertAll(
InsertAllRequest
.newBuilder(tableId)
.addRow(rowContent)
.build()
);
我認為您根據API參考混合了兩種不同的資源類型 。 我的意思是Jobs和Tabledata 。
喬布斯確實裝載在那里從表資料insertAll方法, 並不 :
一次將數據流式傳輸到BigQuery一條記錄中,而無需運行加載作業
我看到Google文檔可能會像上面那樣被誤解,因為將數據加載到BigQuery中的介紹引用了流插入(insertAll)。 如下圖所示:
您可以加載數據:
通過使用流插入插入單個記錄
流插入在哪里重定向到將數據流傳輸到BigQuery中 ,從而說明了流而不是加載:
您可以選擇使用tabledata()。insertAll()方法一次將數據流式傳輸到BigQuery中,而不是使用作業將數據加載到BigQuery中。
關於流插入(insertAll)的最后一件事:
確保您對包含目標表的數據集具有寫訪問權。 除非使用模板表,否則在開始向表中寫入數據之前,該表必須存在 。 有關模板表的更多信息,請參見使用模板表自動創建表。
如果仍然要加載而不是使用模板表流同時創建表並同時創建表,請使用Jobs並加載Job類型 (或其他類型)(如果需要)
我的問題的示例代碼:
Insert insert = bigquery.jobs().insert(projectId,
new Job().setConfiguration(
new JobConfiguration().setLoad(
new JobConfigurationLoad()
.setSourceFormat("NEWLINE_DELIMITED_JSON")
.setDestinationTable(
new TableReference()
.setProjectId(projectId)
.setDatasetId(dataSetId)
.setTableId(tableId)
)
.setCreateDisposition("CREATE_IF_NEEDED")
.setWriteDisposition(writeDisposition)
.setSourceUris(Collections.singletonList(sourceUri))
.setAutodetect(true)
)
));
Job myInsertJob = insert.execute();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.