【问题标题】:Update or Delete tables with streaming buffer in BigQuery?在 BigQuery 中使用流式缓冲区更新或删除表?
【发布时间】:2017-08-22 11:47:57
【问题描述】:

尝试从通过 GCP Console 创建并使用 GCP BigQuery Node.js 表插入函数更新的表中删除记录时,我遇到了以下错误。

UPDATE or DELETE DML statements are not supported over table stackdriver-360-150317:my_dataset.users with streaming buffer

创建的表格没有流式传输功能。根据我在文档Tables that have been written to recently via BigQuery Streaming (tabledata.insertall) cannot be modified using UPDATE or DELETE statements 中阅读的内容。

这是否意味着一旦使用此功能将记录插入到表中,就无法删除记录?有吗?如果是这种情况,是否意味着需要从头开始删除并重新创建表?如果不是这样。您能否建议一种解决方法来避免此问题?

谢谢!


包括 SEO 的新错误消息:“表上的 UPDATE 或 DELETE 语句 ... 会影响流缓冲区中的行,这是不受支持的” -- Fh

【问题讨论】:

    标签: google-bigquery google-cloud-platform


    【解决方案1】:

    要检查表是否有流缓冲区,请检查名为 streamingBuffer 的部分的 tables.get 响应,或者,当流到分区表时,流缓冲区中的数据对于 _PARTITIONTIME 伪具有 NULL 值列,因此即使使用简单的 WHERE 查询也可以检查。

    Streamed data 可在第一次流插入表后几秒钟内进行实时分析,但最长可能需要 90 分钟才能用于复制/导出和其他操作。您可能需要等待最多 90 分钟,以便所有缓冲区都保留在集群上。您可以使用查询来查看流缓冲区是否为空或不像您提到的那样。

    如果您使用加载作业创建表,您将没有流式缓冲区,但可能您将一些值流式传输到它。


    请注意下面的答案,以使用具有持续流缓冲区的表。只需使用WHERE 过滤出最新的数据分钟数,您的查询就会起作用。 -- Fh

    【讨论】:

    • 感谢您的回答。这很有帮助。在 tables.get API 响应中不再包含 streamingBuffer 后,我能够在第二天删除记录。 cloud.google.com/bigquery/docs/reference/rest/v2/tables/get。我意识到streamingBuffer 只是一个瞬态。您只需要等到它不再出现即可更新或删除记录。正如你在上面解释的那样。
    • 感谢 Diego 的问题,我也有同样的困惑,感谢 @Pentium10 的回答。有没有办法从 GCP Web UI 检查流缓冲区?即不通过带有 table.get 的 Node.js API?
    • 刚刚仔细观察 - 当流缓冲区中有元素时,它非常清楚。查看表元数据时,您只需点击“刷新”。谢谢大家!
    • 是否可以刷新流缓冲区?
    • 要检查是否有流式缓冲区,请按表格 > 详细信息 > 检查底部是否有标题“流式缓冲区统计信息”。如果是,那么你在缓冲区中有一些东西。
    【解决方案2】:

    确保更改您的过滤器,使其不包含可能在当前流缓冲区中的数据。

    例如,当我流式传输到此表时,此查询失败:

    DELETE FROM `project.dataset.table` 
    WHERE id LIKE '%-%'
    
    Error: UPDATE or DELETE statement over table project.dataset.table would affect rows in the streaming buffer, which is not supported
    

    您可以通过仅删除旧记录来修复它:

    DELETE FROM `project.dataset.table` 
    WHERE id LIKE '%-%'
    AND ts < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 40 MINUTE)
    
    4282 rows affected.
    

    【讨论】:

    • 对我来说,它与&lt; DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 90 MINUTE) 一起工作,如@Pentium10 所说。谢谢!
    • 我知道这个问题有点晚了,但ts 是什么意思?这是 bigquery 上的列名吗?
    • 是的,我想这将是他跟踪插入时间戳的列
    • @Felipe Hoffa,相关:一旦成功删除记录,是否预计它们会在有限时间内继续显示在 SELECT 查询中?
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2018-06-28
    • 2021-12-22
    • 2018-10-25
    • 1970-01-01
    • 2019-02-28
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多