我在BigQuery上有一个Day-Partitioned Table . 当我尝试使用如下查询从表中删除一些行时:
DELETE FROM `MY_DATASET.partitioned_table` WHERE id = 2374180
我收到以下错误:
错误:分区表尚不支持DML语句 .
一个快速的谷歌搜索引导我:https://cloud.google.com/bigquery/docs/loading-data-sql-dml它也说: "DML statements that modify partitioned tables are not yet supported."
那么现在,我们可以使用一种解决方法来删除分区表中的行吗?
3 回答
DML在此阶段有一些known issues /限制 .
如:
DML语句不能用于修改其架构中具有REQUIRED字段的表 .
每个DML语句都会启动一个隐式事务,这意味着该语句所做的更改会在每个成功的DML语句结束时自动提交 . 不支持多语句事务 .
允许以下DML语句组合在表上并发运行:UPDATE和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以避免限制 .
我已经完成了 without temporary table ,步骤:
1)准备查询,选择应保留的所有行 from particular partition :
必要时为其他分区运行此命令
2)选择 Destination table 作为查询结果,你指向 TO THE PARTICULAR PARTITION ,你需要提供这样的表名:
3)检查选项"Overwrite table" - >它 will overwrite only particular partition
4)运行查询,因为指向分区的冗余行将被删除!
//记住您可能需要为其他分区运行此命令,其中要删除的行分布在多个分区上
您可以使用命令行
bq rm
删除分区表中的分区,如下所示: