我正在尝试使用此示例代码插入一行:
https://developers.google.com/bigquery/streaming-data-into-bigquery#streaminginsertexamples
我收到错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Invalid table ID \"projectid:datasetid.tableid\".",
"reason" : "invalid"
} ],
"message" : "Invalid table ID \"projectid:datasetid.tableid\"."
}
项目,数据集和表格都存在。当我从错误报告中复制实际的projectid:datasetid.tableid并将其粘贴到BigQuery Web UI中时,它可以正常工作。 projectid中有一个' - ',其余的是字母数字。为什么API会抱怨Web UI接受的ID?
更新回答乔丹的问题。这是我的电话:
TableDataInsertAllResponse response =
bigquery
.tabledata()
.insertAll(projectId, datasetId, table.getId(), content)
.execute();
在我调用它之前,我通过获取它们来确保项目,数据集和表都存在。然后我使用表格的实际ID。
新信息:结果(如您所怀疑的)table.getId()返回完全限定的ID,包括项目和数据集。当我对缩短的id进行硬编码以排除它们时,它起作用了。
答案 0 :(得分:4)
啊啊......好吧,这是预期的。 table.getId()
调用将返回表的完全限定名称(即project:dataset.table)。 (见https://developers.google.com/bigquery/docs/reference/v2/tables)。
请尝试使用table.getTableReference().getTableId()
。 (见https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/Table.html#getTableReference())
为什么,你可能会问?每个REST资源都应该具有唯一的ID。表的完全限定唯一ID是项目:dataset.table名称。但是,当您传递id的组件时,表组件只是该名称的最后一部分。