如何在Redshift的COPY命令中为Parquet未包含的列赋值?
解决Redshift COPY加载Parquet时补充缺失列的问题
针对你遇到的Parquet文件列数与目标表不匹配、且无法直接用默认值的问题,提供两种可行方案:
方案一:临时表中转
这是最稳妥的方式,避开Redshift对Parquet格式的默认值限制:
- 创建和Parquet文件列数、结构完全一致的临时表
- 用COPY把Parquet数据加载到临时表
- 从临时表插入目标表时,手动补充
schema_id和timestamp的值
示例代码:
-- 创建临时表,字段与Parquet文件完全对应 CREATE TEMP TABLE temp_parquet_data ( col1 VARCHAR(50), col2 INT, col3 DATE, -- ... 依次列出Parquet的52个字段 ); -- 加载Parquet数据到临时表 COPY temp_parquet_data FROM 's3://your-bucket/path/your-file.parquet' IAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftLoadRole' FORMAT AS PARQUET; -- 插入到目标表,补充缺失列的值 INSERT INTO target_table (col1, col2, col3, ..., schema_id, timestamp) SELECT col1, col2, col3, ..., 'schema_001' AS schema_id, -- 替换为你的固定值或变量 CURRENT_TIMESTAMP AS timestamp -- 或指定固定时间 FROM temp_parquet_data;
方案二:COPY直接指定列并赋值
不需要依赖表的默认值,直接在COPY命令中明确所有列,对缺失的两列直接赋值:
- 在COPY的列列表中包含目标表的所有54列
- 通过
COLUMNS子句,对Parquet不存在的列用固定值或函数赋值
示例代码:
COPY target_table ( col1, col2, col3, ..., -- 先列出Parquet文件的52个字段 schema_id, timestamp ) FROM 's3://your-bucket/path/your-file.parquet' IAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftLoadRole' FORMAT AS PARQUET COLUMNS ( col1, col2, col3, ..., -- 对应Parquet的字段 schema_id AS 'schema_001', -- 自定义schema_id的值 timestamp AS CURRENT_TIMESTAMP -- 自动生成当前时间 );
为什么之前的方法会报错?
- 直接给表设置默认值但不指定列:Redshift会默认要求Parquet文件提供目标表的所有列,因此触发列数不匹配错误
- 指定列名包含默认列:Parquet格式目前不支持在COPY的列列表中包含带DEFAULT约束的列(除非该列存在于Parquet文件中),所以会抛出
DEFAULT columns are currently unsupported的错误
内容的提问来源于stack exchange,提问作者Poreddy Siva Sukumar Reddy US
相关产品推荐
相关产品推荐

