【问题标题】:Truncate a table in GBQ截断 GBQ 中的表
【发布时间】:2015-07-25 03:28:45
【问题描述】:

我正在尝试截断 GBQ 中的现有表,但以下命令在我运行时失败。是否有任何特定的命令或语法可以做到这一点。我查看了 GBQ 文档,但没有运气。

TRUNCATE TABLE [dw_test.test];

【问题讨论】:

标签: google-bigquery


【解决方案1】:

虽然 BigQuery 过去不支持 SELECTs 以外的任何内容,但现在只要您取消选中查询选项中的“使用旧版 SQL”即可。没有截断,而是you can delete

DELETE from my_table WHERE 1=1

请注意,BigQuery 要求在 DELETE 中使用 WHERE,因此,如果您想删除所有内容,请使用始终正确的语句。

【讨论】:

  • Error: 1.1 - 1.58: Unrecognized token DELETE. 这是我尝试此操作时遇到的错误。
  • @hrzafer 您是否在查询选项中禁用了 Legacy SQL 模式?
  • 如果表是使用Require partition filter 标志创建的(例如通过时间戳列ts),那么您只需要指定一个足够宽的时间窗口来删除所有数据,例如@987654329 @ 否则你会得到一个错误,说如果没有对列 'ts' 的过滤器可以用于分区消除,查询将无法成功。 @XiongChiamiov 你能用这个建议更新你的答案吗?
【解决方案2】:

好消息,现在支持 TRUNCATE TABLE:https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#truncate_table_statement

TRUNCATE TABLE [[project_name.]dataset_name.]table_name

但是,请注意,如果您的表定义需要分区过滤器,这将不起作用/不受支持。

【讨论】:

    【解决方案3】:
    CREATE OR REPLACE TABLE <dataset>.<table>
    AS SELECT * FROM <dataset>.<table> LIMIT 0;
    

    对于分区表,假设您在字段“created_on”上有一个天分区,然后执行以下操作:

    CREATE OR REPLACE TABLE <dataset>.<table> PARTITION BY created_on
    AS SELECT * FROM <dataset>.<table> WHERE created_on = CURRENT_DATE() LIMIT 0;
    

    【讨论】:

    • 感谢您抽出宝贵时间提供答案。如果您可以就解决方案的工作原理给出一些解释,那将极大地改善答案。
    • 他基本上只从表中选择 0 条记录,并尝试替换该表(如果存在或创建它)。通过执行此操作,将使用相同的列和数据类型重新创建表,但数据除外。
    • 这在 google bigquery 中效果很好,因为 DELETE 通常会因流缓冲区而失败
    • 在分区表上,即使这样也行不通。 DROP TABLE 是唯一的方法。
    【解决方案4】:

    编辑(2020 年 11 月):BigQuery 现在支持其他动词,请查看其他答案以获取更新的解决方案。

    BigQuery 不支持将 TRUNCATE 作为查询字符串的一部分。 BQ 支持的唯一 DDL/DML 动词是 SELECT

    一种选择是使用WRITE_TRUNCATE write disposition 运行作业(链接用于查询作业参数,但它在所有具有目标表的作业类型上都受支持)。这将截断表中已有的所有数据并将其替换为作业的结果。

    如果您不想用其他数据替换内容或开始工作,最好的选择可能是删除并重新创建具有相同架构的表。

    【讨论】:

    • 如何从 BQ 控制台截断表格?
    • 如果您使用的是 Web UI,您可以在高级查询选项中找到 WRITE_TRUNCATE 处置。在查询编辑器下,单击“显示选项” - 然后将“写入首选项”选项设置为“覆盖表”。
    • 是的,我已经看到了该选项,但只是想知道是否有任何 DDL 命令可以像在标准 SQL 方言中那样完成。
    • 正确,通过查询语言不支持DELETEUPDATEBigQuery tables are append-only,所以如果你想更新或删除特定的行,你需要用你想要的行重新创建表。这可以通过带有目标表的 SELECT * FROM table WHERE NOT() 来完成。
    • @elvainch 编辑建议查看其他答案。
    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 2021-09-13
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2011-06-11
    • 2010-12-04
    相关资源
    最近更新 更多