从BigQuery导出Parquet后BIGNUMERIC转FLOAT32的问题排查
BigQuery BIGNUMERIC导出Parquet后的读取问题解析
问题本质
BigQuery的BIGNUMERIC类型支持77位精度,但主流Parquet读取库(fastparquet、pyarrow)对decimal类型的精度支持均达不到该标准,因此引发不同异常。
1. fastparquet读取数值失真的原因
fastparquet未适配77位精度的decimal类型,会默认将其降级转换为FLOAT32。而FLOAT32仅能保证约6-7位有效数字,完全无法存储77位的超大数值,直接导致数值溢出失真,出现你看到的错误结果。这是fastparquet的兼容性缺陷。
2. pyarrow报错的原因
pyarrow对decimal类型的精度限制为1到76位,BigQuery导出的BIGNUMERIC精度刚好超出这个范围,因此触发ArrowInvalid: Decimal precision out of range [1, 76]: 77错误。这是pyarrow当前的设计上限导致的。
可行的临时解决方案
- 导出前转字符串:在BigQuery中用
CAST(your_bignumeric_col AS STRING)将BIGNUMERIC列转为字符串后再导出,读取到Pandas后,再用pd.to_numeric()配合decimal=True参数转换为Decimal类型,可完整保留原始数值。 - 降低精度导出:如果业务场景允许,将BIGNUMERIC列转换为精度≤76位的NUMERIC类型(
CAST(your_bignumeric_col AS NUMERIC))后再导出,这样pyarrow和fastparquet都能正常解析为Decimal类型。
内容的提问来源于stack exchange,提问作者ly nguyen
相关产品推荐
相关产品推荐

