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

Lio*_*ior 9 google-bigquery

我不小心在我的BigQuery表模式中添加了一个错误的列.

我想知道以下是否可行,而不是重新加载整个表(百万行):

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

是否支持此功能(或类似功能)?可能"将结果保存到表"功能可以具有"紧凑模式"选项.

Sub*_*115 48

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

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


Mik*_*ant 10

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

  1. 选择有效列,同时将错误记录过滤到新临时表中

    SELECT <原始列的列表>
    FROM YourTable
    WHERE <过滤器以删除此处的错误条目>

    写上面的临时表 - YourTable_Temp

  2. 制作"破损"表的备份副本 - YourTable_Backup

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

请注意:高于#1的成本与您问题中第一个项目符号中的操作完全相同.其余的动作(副本)是免费的

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

使用Record type列
创建一个表,创建一个列类型为RECORD的表

我希望,当你需要操作和输出重复/记录数据时,Google BigQuery Team会在某些时候为你的案例添加更好的支持,但是现在这是我发现的最好的解决方法 - 至少对我自己来说


小智 5

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

CREATE OR REPLACE TABLE transactions.test_table AS
SELECT * EXCEPT (c) FROM  transactions.test_table;
Run Code Online (Sandbox Code Playgroud)

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

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


Pen*_*m10 0

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