首页 文章

BigQuery - 从分区表中删除行

提问于
浏览
6

我在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 回答

  • 1

    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以避免限制 .

  • 4

    我已经完成了 without temporary table ,步骤:

    1)准备查询,选择应保留的所有行 from particular partition

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

    必要时为其他分区运行此命令

    2)选择 Destination table 作为查询结果,你指向 TO THE PARTICULAR PARTITION ,你需要提供这样的表名:

    tablename$20171207
    

    3)检查选项"Overwrite table" - >它 will overwrite only particular partition

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

    //记住您可能需要为其他分区运行此命令,其中要删除的行分布在多个分区上

  • 0

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

    bq rm 'mydataset.mytable$20160301'
    

相关问题