You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位精度,就会出现“精度不匹配”的错误提示。

解决方案

你需要做两个调整:

  1. 转换Decimal类型时,指定足够的精度,避免pandas默认精度截断数据
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:14:13