如何在BigQuery中使用ALTER TABLE重命名嵌套STRUCT/ARRAY列?
解决BigQuery嵌套STRUCT/ARRAY列重命名问题
我们在BigQuery中有如下表结构:
CREATE TABLE sample_dataset.sample_table ( id INT ,struct_geo STRUCT < country STRING ,state STRING ,city STRING > ,array_info ARRAY < STRUCT< key STRING ,value STRING > > );
需求是使用ALTER TABLE命令重命名STRUCT和ARRAY中的嵌套列。普通非嵌套列可正常按如下方式重命名:
ALTER TABLE sample_dataset.sample_table RENAME COLUMN id TO str_id
但直接尝试重命名嵌套列会报错,例如执行以下命令重命名STRUCT内列:
ALTER TABLE sample_dataset.sample_table RENAME COLUMN `struct_geo.country` TO `struct_geo.str_country`
会收到错误:ALTER TABLE RENAME COLUMN not found: struct_geo.country;重命名ARRAY内列时也会出现相同报错。且不希望使用CREATE TABLE new_table AS SELECT方案,因为会扫描10TB+的表数据。
解决方案:通过修改列数据类型实现嵌套列重命名
BigQuery支持通过ALTER TABLE ... ALTER COLUMN重新定义STRUCT/ARRAY的类型来修改嵌套列名,这属于元数据级别的操作,不会触发全表数据扫描,完美适配大表场景。
1. 重命名STRUCT内的列
例如将struct_geo.country重命名为struct_geo.str_country,执行以下命令:
ALTER TABLE sample_dataset.sample_table ALTER COLUMN struct_geo SET DATA TYPE STRUCT<str_country STRING, state STRING, city STRING>;
2. 重命名ARRAY内的STRUCT列
例如将array_info数组中嵌套STRUCT的key改为str_key、value改为str_value,执行以下命令:
ALTER TABLE sample_dataset.sample_table ALTER COLUMN array_info SET DATA TYPE ARRAY<STRUCT<str_key STRING, str_value STRING>>;
这种方式本质是重新声明列的结构类型,BigQuery会自动映射原有数据到新的列名上,无需重写或扫描表数据,完全避免了大表扫描的成本。
内容的提问来源于stack exchange,提问作者Ralubrusto
相关产品推荐
相关产品推荐

