使用Java的本机插入查询将数据插入BigQuery

使用Java的本机插入查询将数据插入BigQuery,java,google-cloud-platform,google-bigquery,Java,Google Cloud Platform,Google Bigquery,我使用JAVA的InsertAll方法将行插入到BigQuery中。它总是运作良好。但是当我们试图从JAVA代码中更新同一行时,我得到了以下错误: com.google.cloud.bigquery.BigQueryException更新或删除表project123:mydataset.test上的DML语句会影响流式缓冲区中的行,这是不受支持的 所以我试着用BigQueryConsole 我使用插入查询插入了一行,然后立即更新同一行。它工作得很好 当我阅读BIGQUERY的文章时,他们提到了J

我使用JAVA的InsertAll方法将行插入到BigQuery中。它总是运作良好。但是当我们试图从JAVA代码中更新同一行时,我得到了以下错误:

com.google.cloud.bigquery.BigQueryException更新或删除表project123:mydataset.test上的DML语句会影响流式缓冲区中的行,这是不受支持的

所以我试着用BigQueryConsole

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

当我阅读BIGQUERY的文章时,他们提到了JAVA的InsertAll和使用流缓冲区的控制台的InsertQuery。在这种情况下,控制台查询执行应该失败

为什么控制台查询工作正常?但从Java InsertAll来看,它给我带来了一个异常

如果有人能帮我知道确切的细节,那将非常有帮助

如果有人建议从Java使用本机insert-query-insert,而不是将InsertAll插入到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);
首先,我使用下面的代码片段将值插入到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);
插件工作正常。当我试图更新相同的插入行时,我得到了流缓冲区错误

提前感谢。

当您阅读时,很明显插入程序将执行流写入BigQuery

使用INSERT DML(
INSERT INTO[VALUES..| SELECT…])
时,执行的是查询,而不是流写入。因此,数据管理是不同的。性能也不同(流写入可以每秒写入多达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);

如果您能提供屏幕截图或错误跟踪,效果会更好。这将更容易理解问题谢谢你的评论。我在上面发布的错误只是我在我的本地网站上得到的。如果您遇到过此类错误,请添加您的建议您在哪里读到控制台上的INSERT在流媒体中添加数据?@guillaumeblaquiere当我试图通过控制台更新列(我使用INSERT查询添加)时工作正常。但是当我在JavaAPI中尝试同样的方法时,它抛出了流缓冲区错误。非常感谢您的回复。您能告诉我查询API的详细信息吗?我在@guillaume blaquiere@Neela上面添加了代码详细信息。如果您想更新行,请检查以下线程:并让我们知道它是否适用于you@Ines非常感谢您的回复。我不想使用合并或向上插入操作。从Java开始,首先我必须将数据插入到BigQuery表中,然后我必须单独调用update调用。我面临一个流缓冲区错误。是否有任何方法可以像我们在更新中所做的那样从Java调用本机insert方法查询?还是用其他方式来处理Java中的作业?@guillaume blaquiere非常感谢。让我试试这个,并与大家分享细节。@guillaume blaquiere,我能够插入到bigquery表中。非常感谢。但是你能告诉我它是否有任何限制,比如每天只插入1000条记录,或者如果我们在代码中使用本机插入查询,会有任何限制。我读过DML查询将有限制。请添加您的建议。