BigQuery - 从架构中删除未使用的列

问题描述 投票:0回答:5

我不小心在 BigQuery 表架构中添加了错误的列。

我想知道是否可以执行以下操作,而不是重新加载完整的表(数百万行):

  • 通过使用某种过滤器在表上运行“select *”查询并将结果保存到同一个表来删除坏行(具有值的行包含错误的列)。
  • 删除(现在)未使用的列。

支持此功能(或类似功能)吗? 也许“将结果保存到表”功能可以有一个“紧凑模式”选项。

google-bigquery
5个回答
62
投票

根据文档,从 Big Query 中删除列的最节省时间的方法。

ALTER TABLE [table_name] DROP COLUMN IF EXISTS [column_name]


13
投票

如果您的表不包含记录/重复类型字段 - 您的简单选择是:

  1. 选择有效列,同时过滤掉坏记录到新的临时表中

    选择< list of original columns >
    来自您的餐桌
    哪里< filter to remove bad entries here >

    将上面写入临时表 -

    YourTable_Temp

  2. 制作“损坏”表的备份副本 -

    YourTable_Backup

  3. 删除
    YourTable
  4. 复制
    YourTable_Temp
    YourTable
  5. 检查所有内容是否符合预期,如果是,则删除临时表和备份表

请注意:上述#1 的成本与您问题中第一个项目符号中的操作完全相同。其余操作(复制)是免费的

如果您有重复/记录字段 - 您仍然可以执行上述计划,但在#1中,您将需要使用一些BigQuery用户定义函数在输出中拥有正确的模式
您可以在下面看到示例 - 当然这需要一些额外的开发 - 但如果您处于危急情况 - 这应该对您有用

创建一个包含记录类型列的表
创建一个列类型为 RECORD 的表

我希望,在某些时候,当您需要操作和输出重复/记录数据时,Google BigQuery 团队将为像您这样的情况提供更好的支持,但目前这是我发现的最佳解决方法 - 至少对我自己来说


13
投票

下面是执行此操作的代码。假设 c 是您要删除的列。

CREATE OR REPLACE TABLE transactions.test_table AS
SELECT * EXCEPT (c) FROM  transactions.test_table;

或者第二种方法,我最喜欢的是按照以下步骤操作。

  1. 使用要排除的列编写选择查询。
  2. 进入查询设置 查询设置
  3. 在“目标设置”设置查询结果的目标表中,输入与步骤 1 中输入的项目名称、数据集名称和表名称完全相同的名称。
  4. 在目标表写入首选项中选择覆盖表。 目的地表设置
  5. 保存查询设置并运行查询。

0
投票

将结果保存到表格是您的最佳选择。尝试在大表上选择您感兴趣的列,然后您可以应用限制以使其变小。


0
投票

根据文档,最好的方法是使用创建或替换并选择 * EXCEPT

    CREATE OR REPLACE TABLE mydataset.mytable AS (
  SELECT * EXCEPT (column_to_delete) FROM mydataset.mytable
);

与更改并删除列一样,这不会立即释放已删除列的存储空间

查看此链接以获取更多信息,了解查询背后发生的情况很有用Managing-table-schemas-BigQuery

© www.soinside.com 2019 - 2024. All rights reserved.