Redshift导入Parquet文件时出现Spectrum扫描兼容错误
问题分析与解决方法
错误信息里的矛盾点是关键:明明要导入的是source列,错误却显示它对应Parquet里的sender_last_read(int96类型),这说明列映射出现了错位。
核心原因
你的Spark Schema里包含sent_to列,但Redshift表没有这个列。当Redshift执行COPY导入Parquet时,若未显式指定列对应关系,会因列数量不匹配,导致按物理顺序而非列名匹配,最终把Parquet里的sender_last_read(第6列)错误映射到Redshift表的source(第3列)位置,引发类型不兼容错误。
解决步骤
显式指定列映射
修改COPY命令,明确列出Redshift表的列,并对应Parquet文件中的列(忽略不需要的sent_to):copy schema.table (channel_id, created_at, source, received_at, sender_last_read) from 'path/to/my/s3' iam_role 'role' format as parquet;这种方式强制Redshift按列名匹配,不会受列顺序或多余列影响。
验证Parquet文件元数据
用parquet-tools工具查看Parquet文件的实际列元数据,确认source列的类型和位置是否和Spark显示的一致:parquet-tools meta s3://path/to/my/s3/your-file.parquet如果发现
source列实际类型不是字符串,需要重新生成Parquet文件时确保类型正确。可选:添加缺失列到Redshift表
如果业务上需要保留sent_to列,直接给Redshift表新增该列:ALTER TABLE schema.table ADD COLUMN sent_to varchar(256);之后再执行原COPY命令,列数匹配后映射就不会错位。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

