Redshift导入S3 Parquet含binary列报错Assert code:1000求助
解决Redshift COPY Parquet时Binary列的类型错误问题
问题分析
你遇到的Assert code: 1000 context: Reached unreachable code - Invalid type: 6551错误,本质是Athena定义的binary列在Parquet文件中的存储格式,与Redshift的varbyte类型解析逻辑不兼容导致的。虽然两者理论上都对应Parquet的BYTE_ARRAY类型,但Athena生成Parquet文件时可能给binary列添加了额外元数据标记,导致Redshift无法正确识别类型。
解决方案
1. 确认Parquet文件的实际列类型
用parquet-tools工具查看目标Parquet文件的schema,验证binarycol的类型是否为BYTE_ARRAY:
parquet-tools schema s3://<your-s3-path>/target-file.parquet
如果输出中binarycol的类型是optional byte_array binarycol,说明类型本身没问题,问题出在解析逻辑。
2. 显式指定COPY命令的列列表
尝试在COPY命令中明确列出所有列,强制Redshift按指定顺序和类型映射解析:
COPY redshiftschema.tablename (id, col1, col2, col3, col4, binarycol) FROM 's3://<path>/<tablename>.manifest' iam_role 'redshift-role' FORMAT AS PARQUET manifest;
3. 通过Athena中转导出兼容格式
如果直接COPY仍报错,用Athena作为中间层重新生成Redshift兼容的Parquet文件:
- 执行Athena的UNLOAD命令,将数据导出到临时S3路径:
UNLOAD ('SELECT * FROM your-athena-tablename') TO 's3://<temp-s3-path>/export-' IAM_ROLE 'arn:aws:iam::your-account-id:role/your-athena-role' FORMAT PARQUET;
- 再用COPY命令从临时路径导入Redshift:
COPY redshiftschema.tablename FROM 's3://<temp-s3-path>/export-' iam_role 'redshift-role' FORMAT AS PARQUET;
4. 检查Redshift集群版本
旧版本Redshift对Parquet的BYTE_ARRAY类型支持存在bug,将集群升级到最新可用版本后重试。
内容的提问来源于stack exchange,提问作者Hamza E. Khan
相关产品推荐
相关产品推荐

