如何使用 BigQuery 补丁?

Posted

技术标签:

【中文标题】如何使用 BigQuery 补丁?【英文标题】:How do I use BigQuery patch? 【发布时间】:2013-06-13 22:42:07 【问题描述】:

在 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 补丁来更改表的示例,并说明它实际上可以做什么?

【问题讨论】:

根据googledevelopers.blogspot.com/2013/03/…,更新方法也应该做同样的事情。这样的例子也可以。 【参考方案1】:

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


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

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

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

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

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

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

【讨论】:

几个问题。当您更改字段时,现有字段会发生什么情况?它的名字是否匹配?它有可能重命名它们吗?如果类型不匹配怎么办? 还有一个不相关的性能问题。假设我有一个活动流。当我查询它时,我总是想限制时间范围并随机其他条件(活动类型、用户等)。所以我会把所有的时间都放在桌子上,但只想要一天、一周或一个月。有什么技巧可以让这种使用模式更高效吗? 架构更新只允许您附加字段或放松字段模式(例如,必需 -> 可选)。您不能更改字段名称或类型,也不能重新排序。 您无法针对访问模式优化单个表(这是我们的工作)。但是,您可以做的一件事是按日期对表进行分片,并仅查询包含您关心的日期的表。这种方法还可以为您节省资金,因为您无需付费扫描每个查询的所有数据。 既然我已经引起您的注意,有没有机会让您添加更好的错误消息?现在我在 API 调用中面临“缺少必需的参数”,但我不知道哪个参数,或者我可以在哪里插入它。只是提供我的名字将是一个非常大的提示。

以上是关于如何使用 BigQuery 补丁?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bigquery 连接 GCP SQL 实例?

如何使用 dataflowsdk 将数据从 bigquery 转录到 bigquery?

如何使用 bigquery 服务对象

如何使用 Python BigQuery API 追加到 BigQuery 中的表

BigQuery:如何使用 bigquery.Client().copy_table 方法覆盖表

如何使用 PHP bigquery 客户端库对 bigquery 数据进行分页?