【问题标题】:BigQuery - Delete rows from Partitioned TableBigQuery - 从分区表中删除行
【发布时间】:2017-07-22 13:24:54
【问题描述】:

我在 BigQuery 上有一个按日分区的表。当我尝试使用以下查询从表中删除一些行时:

DELETE FROM `MY_DATASET.partitioned_table` WHERE id = 2374180

我收到以下错误:

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

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

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

    如:

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

    还要注意quota limits

    • 每个表每天最多 UPDATE/DELETE 语句数:48
    • 每个项目每天最多 UPDATE/DELETE 语句数:500
    • 每个表每天最多 INSERT 语句:1,000
    • 每个项目每天最多 INSERT 语句:10,000

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

    【讨论】:

    • 现在似乎允许使用 REQUIRED 字段
    • 最重要的部分:“尚不支持修改分区表的 DML 语句。”基本上,不会删除分区表上的工作...
    【解决方案2】:

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

    bq rm 'mydataset.mytable$20160301'
    

    【讨论】:

      【解决方案3】:

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

      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) 选择 Destination table 作为查询结果,您指向 TO THE PARTICULAR PARTITION,您需要提供如下表名:

      tablename$20171207
      

      3) 勾选“覆盖表”选项 -> 它只会覆盖特定的分区

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

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

      【讨论】:

      • 类似地,如果您想删除除一个以外的所有分区,您可以执行此操作并将目标表设置为不包括 $。那是我的用例,这真的很有帮助!
      【解决方案4】:

      在我撰写本文时,这不再是 BigQuery 的限制!

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

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

      在 BQ UI 中对我有用的示例查询:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-07-24
        • 2017-02-18
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 2018-08-22
        • 1970-01-01
        相关资源
        最近更新 更多