Redshift是否支持IEEE 754浮点数标准?次正规数兼容问题咨询
Redshift双精度浮点数迁移溢出问题
问题现象
近期将Postgres数据库中DOUBLE PRECISION列的数据加载到AWS Redshift的DOUBLE PRECISION列时遇到溢出错误,报错信息如下:
Overflow, 2.8079240261080252e-316 (Double valid range 2.225074e-308 to 1.797693e+308)
从双精度浮点数的标准定义来看,Redshift支持的数值范围仅包含常规双精度数(normal doubles),不支持次正规双精度数(subnormal doubles)。
验证测试
额外做了验证测试:尝试查询最小的次正规双精度数,该操作在Postgres中执行成功,但在Redshift中触发溢出错误,执行的SQL语句如下:
SELECT '4.94065645841246544e-324'::DOUBLE PRECISION;
相关解答
关于Redshift是否未正确实现IEEE 754标准
IEEE 754浮点数标准本身将次正规数支持列为可选实现项,Redshift的行为属于符合标准的合规实现,不属于未正确实现的范畴。Redshift作为面向数据仓库场景的产品,为了提升数值计算的吞吐性能,选择关闭次正规数支持,这类设计在很多高性能计算场景中十分常见,本质是在极端边缘数值支持和计算效率之间做的取舍。
支持/不支持次正规数的系统互操作方案
常用的兼容处理方案有以下几种:
- 迁移数据前在Postgres侧做数值清洗,将绝对值小于
2.225074e-308的极小值统一处理为0,或者按照业务需求映射为Redshift允许的最小合法双精度值,避免迁移时触发溢出 - 如果业务必须保留极小值的完整精度,可以将对应列的类型从
DOUBLE PRECISION调整为DECIMAL类型,两端同步调整类型后再迁移,避免浮点数精度和范围差异导致的问题 - 如果是批量数据迁移场景,可以在ETL流程中增加范围校验节点,对命中次正规数范围的数值单独打标处理,避免全量迁移任务直接失败
内容的提问来源于stack exchange,提问作者b-r-oleary
相关产品推荐
相关产品推荐

