将S3中Parquet文件复制到Redshift时,含逗号列导致失败如何解决?
解决Redshift COPY Parquet文件列数不匹配问题
问题根源
报错代码15007的直接原因是Redshift目标表列数(20)与Parquet文件列数(21)不匹配,和column_16里的逗号无关——Parquet是二进制列式存储,不会把逗号识别为列分隔符,你之前用的ACCEPTINVCHARS参数只适用于CSV等文本格式,对Parquet无效。
解决方案
1. 确认Parquet文件的完整列结构
可以通过两种方式查看Parquet文件的列:
- 用AWS Glue Crawler扫描S3路径,生成表结构后查看所有列;
- 在Redshift中创建外部表指向该S3路径,再查询系统视图获取列信息:
CREATE EXTERNAL SCHEMA spectrum_schema FROM DATA CATALOG DATABASE 'your_db' IAM_ROLE 'iam_role'; CREATE EXTERNAL TABLE spectrum_schema.parquet_table STORED AS PARQUET LOCATION 's3://path/to/parquetfiles/'; SELECT * FROM SVV_EXTERNAL_COLUMNS WHERE schemaname = 'spectrum_schema' AND tablename = 'parquet_table';
2. 调整加载逻辑匹配列数
根据实际需求选一种方式:
- 方式一:修改Redshift目标表结构:添加Parquet文件中多出来的那列,确保列名、数据类型和Parquet文件对应;
- 方式二:COPY时指定要加载的列:跳过Parquet中多余的列,只加载目标表存在的20列,命令示例:
COPY schema.table_name (col1, col2, ..., column_16, ..., col20) FROM 's3://path/to/parquetfiles/' IAM_ROLE 'iam_role' FORMAT AS PARQUET;
3. 确保column_16数据原样加载
Parquet格式会完整保留字符串内容(包括逗号),只要列名和数据类型匹配,无需额外参数就能原样导入Redshift。
内容的提问来源于stack exchange,提问作者Bhavesh Bendale
相关产品推荐
相关产品推荐

