繁体   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