簡體   English   中英

使用 Java 使用本機插入查詢將數據插入 BigQuery

[英]Insert data into BigQuery using native Insert query using Java

我使用 JAVA 使用 InsertAll 方法將行插入 BigQuery。 它工作總是很好。 但是當我們嘗試從 JAVA 代碼更新同一行時,出現以下錯誤,

com.google.cloud.bigquery.BigQueryException 表 project123:mydataset.test 上的 UPDATE 或 DELETE DML 語句會影響流緩沖區中的行,這是不受支持的

所以我從 BigQueryConsole 嘗試過。

我使用INSERT查詢插入了一行,然后立即更新同一行。 它工作得很好。

當我閱讀 BIGQUERY 的文章時,他們提到了 JAVA 中的 InsertAll 和使用 Streaming Buffer 的 Console 中的 INSERT 查詢。 在這種情況下,控制台查詢執行應該會失敗。

為什么控制台查詢工作正常? 但是從 Java InsertAll 來看,它拋出了一個異常。

如果有人幫助我知道確切的細節,那將非常有幫助。

如果有任何建議使用 Java 中的 Native insert 查詢插入而不是 InsertAll到 BigQuery,這將是一個很大的幫助。

請找到代碼片段

首先使用以下代碼片段將值插入 BigQuery

Map<String, Object> map = new HashMap<>();
map.put("1", "name");
map.put("2", "age");

BigQuery bQuery = BigQueryOptions.newBuilder().setCredentials(credentials).setProjectId(id)
            .build().getService();
InsertAllResponse response = bQuery .insertAll(InsertAllRequest.newBuilder(tableId).addRow(map).build());

插入后,我嘗試使用以下代碼片段更新該表中的行

String updateQuery = String.format( "UPDATE `%s` SET name = \"%s\" WHERE age = \"%s\")", name, age);
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).build();
bQuery.query(queryConfig);

插入工作正常。 當我嘗試更新相同的插入行時,出現流緩沖區錯誤。

提前致謝。

當您閱讀文檔時,很明顯 insertAll 執行寫入 BigQuery 的流。

當您使用 INSERT DML ( INSERT INTO <table> [VALUES....|SELECT...] ) 時,您執行的是查詢,而不是流寫入。 所以,數據管理是不一樣的。 性能也不同(Stream write每秒最多可以寫入100萬行,DML是逐個查詢的,數據更少花費更多時間)。

所以,我不知道您的代碼以及您想要實現的目標。 但是如果你想使用通常的查詢(插入、更新、刪除),請使用查詢 API。

編輯

我試圖調整你的代碼(但這是錯誤的,我做了一些假設),我可以向你提出這個建議。 只需執行查詢,而不是加載作業或流式寫入。

        String tableName = "YOUR_TABLE_NAME";
        
        String insertQuery = String.format("INSERT INTO %s(name, age) VALUES (1,2)", tableName);
        QueryRequest queryRequest = QueryRequest.builder(insertQuery).build();
        bQuery.query(queryRequest);


        String updateQuery = String.format( "UPDATE `%s` SET name = \"%s\" WHERE age = \"%s\")", tableName, name, age);
        queryRequest = QueryRequest.builder(updateQuery).build();
        bQuery.query(queryRequest);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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