为啥 BigQuery 没有删除列的选项?

Posted

技术标签:

【中文标题】为啥 BigQuery 没有删除列的选项?【英文标题】:Why BigQuery doesn't have an option to remove column?为什么 BigQuery 没有删除列的选项? 【发布时间】:2017-08-22 11:25:48 【问题描述】:

我正在寻找一个选项来从我的 BigQuery 表中删除一列,例如 ALTER TABLE TABLE_NAME DROP COLUMN_NAME - 但我在网上找到的只是删除旧表并创建一个新表。

我只是想知道,BigQuery 中没有此选项是否有任何合乎逻辑的原因?

【问题讨论】:

【参考方案1】:

删除一列意味着从构成表的所有Capacitor files 中删除数据,这是一项昂贵的操作。如果 BigQuery 只是删除与列相关的元数据,您将需要为无法实际查询的虚拟列支付存储费用,这并不理想。

相反,当您添加列时,BigQuery 会将过去文件中缺少的列视为具有所有 NULL 值,因此不需要修改它们。

有几个不同的选项可以删除一列:

从原始表中选择,不包括您不想保留的列。然后复制生成的表并覆盖原始表。 在包含所需列的表上创建逻辑视图。现在查询逻辑视图而不是表——您可以进行其他“修改”,例如强制转换或过滤,而无需触及基础表。缺点是您将需要为不再需要查询的旧列付费。

【讨论】:

谢谢。对于使用列式存储模型的数据库来说,这总是令人惊讶,从表面上看,这会使删除列更容易!【参考方案2】:

您可以通过重写表格删除列。

CREATE OR REPLACE TABLE
  temp.table_name AS
SELECT
  * EXCEPT (column_name)
FROM
  temp.table_name

【讨论】:

在分区表上运行此命令会出现错误:无法用不同的分区规范替换表。相反,删除表,然后重新创建它。新分区规范为无,现有规范为间隔(类型:天,字段:活动日期)【参考方案3】:

BigQuery 现在支持DROP COLUMN

ALTER TABLE [[project_name.]dataset_name.]table_name
DROP COLUMN [IF EXISTS] column_name [, ...]

【讨论】:

请不要对多个问题添加相同的答案。回答最好的一个并将其余的标记为重复。见Is it acceptable to add a duplicate answer to several questions? 谢谢,这将有助于保持网站清洁

以上是关于为啥 BigQuery 没有删除列的选项?的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery:检查流期间的重复项

删除 BigQuery 列的一种可能方法

有没有办法在 bigquery 中删除表列?

查找要插入 BigQuery 的列名

Google BigQuery 在加载作业的 ignoreUnknownValues 选项上出现意外行为(收到额外列的错误)

如何通过删除基于 8 列中的 2 列的重复项来清理 BigQuery 表?