从S3复制Parquet到Redshift失败:Unreachable Invalid type:4000求助
排查Redshift COPY Parquet时的Assert错误(Invalid type:4000)
排查步骤
检查Parquet文件的元数据与数据类型
用parquet-tools或Pandas读取报错表(如users)的Parquet文件,对比正常文件的schema差异:import pandas as pd df = pd.read_parquet("s3://<your-bucket>/path/to/users.parquet") print(df.dtypes)重点确认是否存在Redshift不支持的类型(如特定复杂类型、异常精度的数值类型),或本次导出的文件中出现了之前没有的类型定义。
验证Redshift目标表结构兼容性
检查Redshift表结构是否有变更:DESCRIBE users;对比Parquet文件的列名、数据类型与Redshift表是否匹配——即使使用
FILLRECORD,类型不兼容仍可能触发内部断言错误。手动测试COPY命令
在Redshift控制台手动执行简化版COPY命令,排除Airflow参数传递问题:TRUNCATE users; COPY users FROM 's3://<your-bucket>/path/to/users.parquet' IAM_ROLE '<your-iam-role>' FORMAT AS PARQUET FILLRECORD;同时尝试COPY单个小文件,排查是否存在大文件或文件损坏问题。
查看更详细的Redshift日志
除SVL_S3LOG外,查询STL_ERROR获取更多错误细节:SELECT * FROM STL_ERROR WHERE query = 3514431;确认集群是否处于正常状态,近期是否有版本更新或维护操作。
排查Pandas导出逻辑
检查Airflow中RDS导出到Parquet的代码:- 是否有逻辑变更(如新增数据处理步骤)
- 使用的Parquet引擎(pyarrow/fastparquet)是否与之前一致
- Pandas或相关依赖库是否有版本升级,导致导出格式变化
修复方案
- 修正Parquet文件类型:若发现不兼容类型,调整Pandas导出逻辑,将其转为Redshift支持的类型(如PostgreSQL
jsonb转为字符串,高精度数值转为Redshift兼容的DECIMAL类型)。 - 同步表结构:若Redshift表结构有变更,同步Parquet文件的schema;或在COPY命令中使用
COLUMNS参数明确指定列映射。 - 重新导出损坏文件:若确认Parquet文件损坏,重新执行RDS导出任务,确保导出过程无报错。
- 调整Redshift版本:若错误是Redshift版本更新导致,可尝试升级到最新稳定版或回滚至之前正常的版本(需结合业务情况评估)。
内容的提问来源于stack exchange,提问作者Hazel Lin
相关产品推荐
相关产品推荐

