6

在 BigQuery API 文档中,有一个名为 patch 的方法。我希望我可以用它来改变现有表的模式。不幸的是,bq 不支持它。但根据他们的网站,您可以在https://developers.google.com/bigquery/docs/reference/v2/tables/patch尝试一下。但是,当我尝试时,它会发送以下请求:

PATCH https://www.googleapis.com/bigquery/v2/projects/(my project id)/datasets/tmp_bt/tables/change_cols?key={YOUR_API_KEY}

Content-Type:  application/json
Authorization:  Bearer (removed)
X-JavaScript-User-Agent:  Google APIs Explorer

{
 "schema": {
  "fields": [
   {
   },
   {
   },
   {
    "mode": "nullable",
    "name": "gotchahere",
    "type": "string"
   }
  ]
 }
}

(我不知道空元素是从哪里来的,而且编辑器太痛苦了,无法粘贴到我现有的表定义中。我注意到它缺少像我的项目 ID 这样的必需元素,我希望将其包括在内,因为它们表格中需要),然后我得到回复:

cache-control:  private, max-age=0
content-encoding:  gzip
content-length:  122
content-type:  application/json; charset=UTF-8
date:  Thu, 13 Jun 2013 22:22:09 GMT
expires:  Thu, 13 Jun 2013 22:22:09 GMT
server:  GSE

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error"
   }
  ],
  "code": 503,
  "message": "Backend Error"
 }
}

这是完全没用的。我进行了网络搜索,但没有找到任何使用中的示例。

谁能给我一个使用 BigQuery 补丁来更改表的示例,以及它实际上可以做什么的描述?

4

1 回答 1

15

TLDR:您需要在补丁请求的正文中提供完整的架构,而不仅仅是您尝试添加的字段。后端错误可能是由该数组中的空字段引起的。


BigQuery 的 API 允许以两种方式更新表(和其他资源):更新和修补。

update方法用您提供的新资源替换表资源。如果您想要获取现有表资源,对其进行修改,然后将该修改后的表资源全部发布回 BigQuery,则此方法非常有用。(但是请注意,对象的某些字段,例如 creationTime,被认为是不可变的,因此为这些字段提供的新值将被忽略。)

patch方法仅替换您在请求中包含的字段,而使其余资源保持不变。如果您想对一个字段进行单独的更改而不担心其他字段,则此方法很有用。该算法递归地应用于任何嵌套对象,但不适用于嵌套数组。换句话说,您随请求发送的补丁资源将与现有资源递归合并,直到遇到数组或标量值,此时补丁对象中的数组或值替换现有资源中的数组或值。

由于您尝试更新的架构包含一个字段数组,并且由于 patch 方法会批量更新数组,因此您的 patch 对象需要包含您想要在结果架构中的完整字段数组。(不能通过在补丁对象中指定一个字段数组来添加字段。)

请注意,表 ID 在请求 URL 中给出,因此它不需要包含在对象本身中。

最后,后端错误是我们这边的问题,可能是您请求中的两个空架构字段的结果。我们将进一步挖掘,并希望在未来改进错误消息。

于 2013-06-14T17:20:45.977 回答