BigQuery - 从分区表中删除行

时间:2017-03-02 17:18:27

标签: google-bigquery

我在BigQuery上有一个Day-Partitioned表。当我尝试使用如下的查询从表中删除某些行时:

DELETE FROM `MY_DATASET.partitioned_table` WHERE id = 2374180

我收到以下错误:

  

错误:分区表尚不支持DML语句。

快速Google搜索引导我:https://cloud.google.com/bigquery/docs/loading-data-sql-dml,其中还说:“尚不支持修改分区表格的DML语句。”

所以现在,我们可以使用一种解决方法来删除分区表中的行吗?

4 个答案:

答案 0 :(得分:4)

DML在此阶段有一些known issues /限制。

如:

  • DML语句不能用于修改其架构中具有REQUIRED字段的表。
  • 每个DML语句都会启动一个隐式事务,这意味着该语句所做的更改会在每个成功的DML语句结束时自动提交。不支持多语句事务。
  • 允许以下DML语句组合在表上并发运行: 更新和插入
    删除并插入
    INSERT和INSERT
    否则将中止其中一个DML语句。例如,如果两个UPDATE语句同时针对表执行,则只有其中一个会成功。
  • 使用UPDATE或DELETE语句无法修改最近通过BigQuery Streaming(tabledata.insertall)写入的表。要检查表是否具有流缓冲区,请检查tables.get响应以查找名为streamingBuffer的节。如果不存在,则可以使用UPDATE或DELETE语句修改表。
  • 尚不支持修改分区表的DML语句。

另请注意quota limits

  • 每张桌子每天的最大UPDATE / DELETE语句:48
  • 每个项目每天的最大UPDATE / DELETE语句:500
  • 每张桌子每天最多INSERT语句:1,000
  • 每个项目每天最多INSERT语句:10,000

您可以做的是将整个分区复制到非分区表并在那里执行DML语句。然后将临时表写回分区。此外,如果每个表每天遇到DML更新限制语句,则需要创建表的副本并在新表​​上运行DML以避免限制。

答案 1 :(得分:1)

我已经完成了没有临时表,步骤:

1)准备查询,选择应保留的特定分区的所有行

SELECT * FROM `your_data_set.tablename` WHERE 
_PARTITIONTIME = timestamp('2017-12-07') 
AND condition_to_keep_rows_which_shouldn't_be_deleted = 'condition' 

如有必要,请为其他分区运行

2)选择目标表作为查询结果,将指向特定分区,您需要提供如下表格名称:

tablename$20171207

3)检查选项"覆盖表" - > 将仅覆盖特定分区

4)运行查询,因为指向分区的冗余行将被删除!

//记住你可能需要为其他分区运行它,你要删除的行分布在多个分区上

答案 2 :(得分:0)

您可以使用命令行bq rm删除分区表中的分区,如下所示:

bq rm 'mydataset.mytable$20160301'

答案 3 :(得分:0)

就像我撰写本文时一样,这不再是BigQuery的限制!

在标准SQL中,假设不是最近(过去30分钟内)不是通过流插入插入被删除的行,则在分区表上的上述语句将成功。

有关DML的当前文档:https://cloud.google.com/bigquery/docs/reference/standard-sql/data-manipulation-language

在BQ用户界面中对我有用的示例查询:

DELETE 
FROM dataset_name.partitioned_table_on_timestamp_column
WHERE 
timestamp >= '2020-02-01' AND timestamp < '2020-06-01'

仓鼠旋转后,我们得到BQ响应:

This statement removed 101 rows from partitioned_table_on_timestamp_column