Redshift导入Parquet数据报错求助:Decimal类型无效指数'e'
问题分析与解决方案
核心问题:COPY命令参数配置错误
你当前的COPY命令是按照CSV格式设置的(指定了delimiter ','、IGNOREHEADER 1),但源文件是Parquet格式——Redshift处理Parquet需要专门的格式声明,这些CSV相关参数会打乱解析逻辑,直接引发后续的数据类型错误。
报错含义拆解
ERROR:Invalid digit, Value '.', Pos 0, Type: Double:Redshift被迫按CSV规则解析Parquet数据,把某个以小数点开头的内容当作Double类型值解析,不符合数字格式规范,导致失败。ERROR:Invalid exponent, Value 'e', Pos 187, Type: Decimal:改成numeric类型后,解析逻辑还是错的,Parquet里的科学计数法数值(带'e')被当成普通Decimal值解析,而Decimal默认不识别科学计数法格式,所以报错。
正确的COPY命令写法
移除所有CSV相关参数,添加Parquet格式声明:
COPY table_name FROM 's3://bucket/folder/file_name.parquet' credentials 'aws_iam_role=...' NULL AS 'NULL' EMPTYASNULL region 'region_name' FORMAT AS PARQUET;
额外排查建议
如果调整命令后仍有类型报错,按以下步骤定位问题:
- 重新用AWS Glue Crawler爬取Parquet文件,确认生成的表结构和Parquet实际数据类型完全匹配(比如Parquet的float对应Redshift的double,decimal类型要注意精度和小数位一致)。
- 用
aws s3 cp命令下载部分Parquet样本到本地,用Pandas、Parquet Viewer等工具查看具体列的数值,检查是否有异常值(比如数值列里混入了字符串)。 - 在COPY命令里添加
LOG 's3://bucket/log_path/'参数,启用错误日志,通过日志文件查看具体错误行和对应列,精准定位问题列。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

