使用BQ CREATE TABLE AS SELECT复制表时REQUIRED列变为NULLABLE求助
解决BigQuery CTAS语句丢失REQUIRED列模式的问题
方法一:先定义表结构再插入数据
CTAS语句会默认将所有列设为NULLABLE,要保留原表的REQUIRED模式,需先手动定义新表的完整结构(和原表一致,仅移除person数组里的add字段),再插入处理后的数据。
- 创建匹配需求的新表结构:
CREATE TABLE `project_id.dataset.new_table_name` ( -- 复制原表所有字段定义,仅修改person字段结构 id INT64 REQUIRED, name STRING REQUIRED, person ARRAY<STRUCT< id INT64 REQUIRED, name STRING REQUIRED -- 移除原有的add字段 >> REQUIRED, -- 其他原表字段按实际情况添加,保持原有REQUIRED/NULLABLE模式 create_time TIMESTAMP REQUIRED );
- 插入处理后的数据:
INSERT INTO `project_id.dataset.new_table_name` SELECT * REPLACE( ARRAY(SELECT AS STRUCT person.* EXCEPT(add) FROM t.person) AS person ) FROM `project_id.dataset.table_name` t;
方法二:继承原表结构再修改目标字段
如果原表字段较多,手动编写结构太繁琐,可以先继承原表结构,再调整person字段的定义:
- 创建继承原表结构的空表:
CREATE TABLE `project_id.dataset.new_table_name` SCHEMA FROM `project_id.dataset.table_name` OPTIONS( description="继承原表结构,调整person字段" );
- 修改
person字段结构,移除add列并保留REQUIRED模式:
ALTER TABLE `project_id.dataset.new_table_name` ALTER COLUMN person SET DATA TYPE ARRAY<STRUCT< id INT64 REQUIRED, name STRING REQUIRED >> REQUIRED;
- 插入数据:
INSERT INTO `project_id.dataset.new_table_name` SELECT * REPLACE( ARRAY(SELECT AS STRUCT person.* EXCEPT(add) FROM t.person) AS person ) FROM `project_id.dataset.table_name` t;
关键说明
- CTAS语句会把REQUIRED改为NULLABLE,核心原因是BigQuery无法确保查询返回的每一行都包含非空值(即便原表字段是REQUIRED),因此默认设为NULLABLE。
- 只有显式定义表结构,才能强制保留REQUIRED模式,两种方法本质都是先确定结构再插入数据,区别在于是否手动编写完整字段定义。
内容的提问来源于stack exchange,提问作者Tech_Dev
相关产品推荐
相关产品推荐

