BigQuery:表 ID 无效

Posted

技术标签:

【中文标题】BigQuery:表 ID 无效【英文标题】:BigQuery: Invalid table ID 【发布时间】:2013-09-30 20:09:42 【问题描述】:

我正在尝试使用此示例代码插入一行:

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 以排除它们时,它起作用了。

【问题讨论】:

听起来您正在发送单个名称作为表名,而不是将其拆分为组件。如果不是这样,您可以发送您正在调用的实际代码吗? 嗨,乔丹。更新。 (顺便说一句,感谢你们为 SO 付出的努力。) 【参考方案1】:

啊哈...好吧,这是意料之中的。 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 是 project:dataset.table 名称。但是,当您传递 id 的组件时,表组件只是该名称的最后一部分。

【讨论】:

以上是关于BigQuery:表 ID 无效的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 数据集 ID 无效

BigQuery 调度:错误代码 3:user_id 的值为 0 无效

Google Bigquery - 查询无效

bigquery 标准 sql 错误,时间戳无效

错误代码:在 BigQuery 上加载数据时无效

从 Dataflow python 作业写入 bigquery 中的分区表