在BigQuery中使用流缓冲区更新或删除表?

Die*_*ego 20 google-bigquery google-cloud-platform

尝试从通过GCP控制台创建的表中删除记录并使用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.

这是否意味着一旦将此函数插入​​表中,就无法删除记录?什么?如果是这种情况,是否意味着需要删除表并从头开始重新创建?如果不是这样的话.你能否建议一个解决方法来避免这个问题?

谢谢!

Pen*_*m10 22

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

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

如果使用加载作业来创建表,则不会有流缓冲区,但可能会向其传输一些值.

  • 谢谢你的回答。这很有帮助。在tables.get API响应中不再包含streamingBuffer之后,我能够在第二天删除记录。https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/get。我意识到streamingBuffer 只是一个瞬态。您只需要等到它不再显示更新或删除记录。正如你上面解释的那样。 (3认同)
  • 是否可以刷新流缓冲区? (3认同)
  • 要检查是否有流缓冲区,请按表 > 详细信息 > 检查底部是否有标题“流缓冲区统计信息”。如果是,那么缓冲区中有东西。 (3认同)

Fel*_*ffa 6

确保更改过滤器,以使它们不包括当前流缓冲区中可能包含的数据。

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

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
Run Code Online (Sandbox Code Playgroud)

您可以通过删除旧记录来解决此问题:

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

4282 rows affected.
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它适用于 `&lt; DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 90 MINUTE)`,如 @Pentium10 所说。谢谢! (7认同)
  • 我知道这个问题有点晚了,但是“ts”是什么意思?这是bigquery 上的列名吗? (2认同)