如何在BigQuery中从分区表中删除列



对于BigQuery中的分区表,我们不能使用create or replace table语句。我可以将表导出到GCS,但BigQuery会生成多个JSON文件,这些文件无法一次导入到表中。有没有一种安全的方法可以从分区表中删除列?我使用BigQuery的web界面。

云控制台、经典BigQuery web UI、bq命令行工具或API不支持重命名列。如果尝试使用重命名的列更新表架构,则返回以下错误:更新操作中的BigQuery错误:提供的架构与表project_id:dataset.table.不匹配

有两种方法可以手动重命名列:

  1. 使用SQL查询:如果您更关心简单性和易用性,而不太关心成本,请选择此选项
  2. 重新创建表格:如果您更关心成本,而不太关心简单性和易用性,请选择此选项

如果你想删除一列,你可以:

  • 使用SELECT*EXCEPT查询排除要删除的列,并使用查询结果覆盖表或创建新的目标表
  • 您还可以通过将表数据导出到云存储来删除列,删除与要删除的列相对应的数据,然后将数据加载到架构定义不包括已删除列的新表中。也可以使用加载作业覆盖现有表

发布了一份关于手动更改表架构的指南。

编辑

要将分区表更改为非分区表,可以使用控制台查询数据并覆盖当前表或复制到新表。举个例子,我在BigQuery中有一个表,由_PARTITIONTIME分区。我使用以下查询创建了一个非分区表

SELECT *, _PARTITIONTIME as pt FROM `project.dataset.table` 

使用上面的代码,您将查询所有表分区中的数据,并创建一个额外的列来显示数据来自哪个分区。然后,在执行它之前,有两个选项,将视图保存在一个新的非分区表中或覆盖当前表:

创建新表转到:更多(在查询编辑器下(>查询设置>勾选框";设置查询结果的目的地表">选择您的项目、数据集并写入新表的名称>在Destination table write preference下,选中write if empty。

覆盖当前表:更多(在查询编辑器下(>查询设置>勾选框";设置查询结果的目的地表">为当前表选择相同的项目和数据集>写入与要覆盖的表相同的表名>在Destination table write preference下,选中Overwrite table。

信用

最新更新