我在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语句。”
所以现在,我们可以使用一种解决方法来删除分区表中的行吗?
答案 0 :(得分:4)
DML在此阶段有一些known issues /限制。
如:
另请注意quota limits
您可以做的是将整个分区复制到非分区表并在那里执行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