Redshift使用PARQUET格式COPY命令报Column mapping not supported如何解决
问题根因说明
你遇到的两个报错都是Redshift COPY命令的特性限制导致的:
- 第一个
Column mapping option argument is not supported for PARQUET based COPY错误,原因是Redshift 原生不支持在FORMAT AS PARQUET的COPY语句中显式指定列列表,该列映射特性仅对CSV、JSON等文本类格式生效。 - 第二个
Delimiter not found错误,原因是你去掉FORMAT AS PARQUET参数后,Redshift COPY默认把输入文件识别为CSV格式,会尝试按默认分隔符解析二进制的Parquet文件,自然找不到分隔符报错。
解决方案
方案1:调整表结构直接COPY(优先推荐)
这是操作成本最低的方案,不需要额外处理数据:
- 首先确认Redshift目标表中,Parquet文件缺失的列均设置为允许NULL或配置了显式默认值(比如
DEFAULT 0、DEFAULT CURRENT_TIMESTAMP等) - 确认Parquet文件中的列名和Redshift表中需要导入的列名完全一致,大小写不匹配的话可以在COPY命令中加
IGNORECASE参数忽略大小写 - 直接使用无列列表的COPY命令即可,示例:
COPY table_name FROM 's3://你的桶路径/' ACCESS_KEY_ID '你的AK' SECRET_ACCESS_KEY '你的SK' FORMAT AS PARQUET IGNORECASE -- 可选,列名大小写不一致时添加 REGION '你的S3桶所属区域';
Redshift会自动按列名匹配导入,缺失的列自动填充默认值或NULL。
方案2:临时表中转导入
如果不能修改目标表的结构(比如缺失的列不允许NULL也没有默认值),可以用临时表中转实现部分列导入:
- 新建和Parquet文件列结构完全一致的临时表:
CREATE TEMP TABLE temp_parquet_data ( column1 类型1, column2 类型2, -- 其余列和Parquet文件列一一对应 );
- 将Parquet数据COPY到临时表:
COPY temp_parquet_data FROM 's3://你的桶路径/' ACCESS_KEY_ID '你的AK' SECRET_ACCESS_KEY '你的SK' FORMAT AS PARQUET IGNORECASE REGION '你的S3桶所属区域';
- 从临时表插入数据到目标表,手动填充缺失列的值:
INSERT INTO target_table (column1, column2, 缺失列1, 缺失列2) SELECT column1, column2, '自定义填充值1', '自定义填充值2' FROM temp_parquet_data;
内容的提问来源于stack exchange,提问作者SRN
相关产品推荐
相关产品推荐

