【问题标题】:Google bigquery update rows谷歌 bigquery 更新行
【发布时间】:2013-09-22 04:50:48
【问题描述】:

那么任何人都可以提供有关如何更新一组行的想法吗?

我理解查询的概念 -> 新表,然后转储“旧”表并重新命名“新”,但老实说这是很牛逼的。

我在文档、网络或新想法中也没有看到任何东西会让我相信“更新”声明的出现。

有人想吗?

【问题讨论】:

标签: google-bigquery


【解决方案1】:

BigQuery 现已提供对插入、更新和删除行和列的支持,但仅适用于没有流式缓冲区的表。

【讨论】:

  • 这个答案有点误导:没有表“没有流缓冲区”=> 任何表都可以通过insertAll(stream leagacy api) 或通过新的 Write API 流式传输.只要流缓冲区中仍有数据,这些数据就无法更新或删除(BQ 工作人员通常需要 90 分钟才能将这些数据从缓冲区写入 BQ 中的列式存储。
【解决方案2】:

[更新此答案已过时]

BigQuery 目前不支持直接更新单个行。您可以追加到表中,也可以截断/覆盖表,但不能在保持表的其余部分不变的情况下对单行应用更新。

您提到的流程(创建新表,替换旧表)是一种合理的方法。如果有帮助,请注意您不需要两个单独的步骤即可将旧表替换为新表。由于 BigQuery 以原子方式应用作业副作用,因此您可以通过将最终复制作业的 writeDisposition 设置为 WRITE_TRUNCATE 来一步替换旧表。例如,您可以执行以下操作:

  query table -> table with WRITE_TRUNCATE

就像更新一样,您应该注意这对旧表具有破坏性。但是,如果您没有更改架构,则可以使用快照装饰器在截断发生之前读取表。

在发生此更新过程时,您可以针对“表”运行查询作业,并且这些作业可以保证看到旧内容或新内容,而两者之间没有不一致或错误的状态。

【讨论】:

  • "在任何一种情况下,当此更新过程发生时,您可以针对“表”运行查询作业,并且这些作业可以保证看到旧内容或新内容,没有不一致或介于两者之间的错误状态。”真的吗?这完全没有意义。
  • 在下面的答案中查看 Jordan 的跟进。简短版本:BigQuery 确实支持原子更新,因此如果您对即将更新的表运行查询,该查询将在更新之前或之后看到表状态的快照。它永远不会看到空表或部分更新。 stackoverflow.com/a/18880082/1375400
  • 我在 api 文档中找到了update 方法,你能提供任何如何使用它的例子吗? developers.google.com/resources/api-libraries/documentation/…
  • 该方法更新表元数据。上面的答案是指通过运行设置了 destinationTable 和 writeDisposition 的查询来更新表,以便覆盖所需的表。在此处查看运行查询的文档:cloud.google.com/bigquery/querying-data?hl=en#asyncqueries
【解决方案3】:

2016 年 9 月 29 日,Google update 那里有DML,现在我们可以编写标准 SQL,这使我们能够在 BigQuery 数据集中插入、更新和删除行和列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多