簡體   English   中英

從Java在BiqQuery中創建有關數據加載的表

[英]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參考混合了兩種不同的資源類型 我的意思是JobsTabledata

喬布斯確實裝載在那里從表資料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.

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