PyArrow将DataFrame转Parquet时Decimal128缩放致数据丢失报错问题咨询
PyArrow将DataFrame转Parquet时Decimal128缩放致数据丢失报错问题咨询
嗨,我来帮你捋清楚这个问题的根源~
首先咱们得先搞懂PyArrow里decimal128(precision, scale)参数的真实含义:这里的precision指的是总有效数字的位数(整数部分+小数部分的数字总数),而不是你以为的“整数部分的位数”。
你看你这个数值:79812042284098215031627424085742912847.808901592419987254,咱们数一下:
- 整数部分:整整38位数字
- 小数部分:18位数字
- 总有效数字位数:38+18=56位
但PyArrow的decimal128类型最大只支持38位的总精度,你要把56位的数值塞进38位的容器里,必然会触发“缩放时数据丢失”的报错——这就是问题的核心!
至于你换成decimal256时的报错,大概率是你没同步调整precision参数,还是用了38。decimal256虽然支持最高76位的总精度,但如果你指定的precision=38,而PyArrow从你的数值里推断出实际需要56位精度,就会出现“精度不匹配”的错误提示。
解决方案
你需要做两个调整:
- 转换Decimal类型时,指定足够的精度,避免pandas默认精度截断数据
- 使用
decimal256类型,并把总精度设为至少56(覆盖你数值的总有效位数)
修正后的代码示例如下:
from decimal import Decimal, Context import pandas as pd import pyarrow as pa # 构造原始DataFrame df = pd.DataFrame({ "BOOKG_AMT_XCHG_RATE_NMRC": [79812042284098215031627424085742912847.808901592419987254] }) # 转换为Decimal时,用Context指定足够的总精度(56位) decimal_ctx = Context(prec=56) df['BOOKG_AMT_XCHG_RATE_NMRC'] = df['BOOKG_AMT_XCHG_RATE_NMRC'].apply( lambda x: Decimal(str(x), context=decimal_ctx) ) # 定义PyArrow schema时,使用decimal256,总精度设为56,scale保持18 target_schema = pa.schema([ ('BOOKG_AMT_XCHG_RATE_NMRC', pa.decimal256(56, 18)) ]) # 写入Parquet文件 df.to_parquet('your_file.parquet', schema=target_schema)
这样应该就能顺利写入,不会再出现数据丢失或精度不匹配的报错啦~
备注:内容来源于stack exchange,提问作者lapots
相关产品推荐
相关产品推荐

