python - 使用 Dask read parquet 读取具有不同数据类型(如十进制)的 parquet 文件时出现问题
问题描述
我有一些 parquet 文件是通过 Spark 将 AVRO 文件转换为 parquet 文件创建的。这些 parquet 文件包含不同的数据类型,如十进制、整数、字符串、布尔值。但是,当我使用带有 pyarrow 引擎的 dd.read_parquet 读取此文件时,除了 int 之外,其他所有内容都转换为对象数据类型,这会导致算术计算出现问题。我尝试使用 float dtypes 作为小数列,但这会降低精度。知道如何在不丢失精度的情况下读取值吗?
parquet 文件的架构
<pyarrow._parquet.FileMetaData object at >
created_by: parquet-mr version 1.10.1 (build a89df8f9932b6ef6633d06069e50c9b7970bebd1)
num_columns: 7
num_rows: 1
num_row_groups: 1
format_version: 1.0
serialized_size: 4376
ID: string
CODE: string
CURRENCY: string
DEDUCT: decimal(20, 2)
PERCENT: decimal(11, 10)
MIN_DEDUCT: decimal(20, 2)
MAX_DEDUCT: decimal(20, 2)
元数据
{b'org.apache.spark.sql.parquet.row.metadata': b'{"type":"struct","fields":[{'
b'"name":"ID","'
b'type":"string","nullable":tr'
b'ue,"metadata":{}},{"name":"'
b'CODE","typ'
b'e":"string","nullable":true,'
b'"metadata":{}},{"name":"'
b'CURRENCY","typ'
b'e":"string","nullable":true,'
b'"metadata":{}},{"name":"DEDU'
b'CT","type":"decimal(20,2'
b')","nullable":true,"metadata'
b'":{}},{"name":"'
b'DEDUCT","'
b'type":"decimal(11,10)","null'
b'able":true,"metadata":{}},{"'
b'name":"MIN_DEDUCT","'
b'type":"decimal(20,2)","nulla'
b'ble":true,"metadata":{}},{"n'
b'ame":"MAX_DEDUCT","t'
b'ype":"decimal(20,2)","nullab'
b'le":true,"metadata":{}}]}'}
解决方案
我不相信你会通过使用浮点数(双精度,64 位)来为两位小数位列丢失精度,尽管你会得到稍微不同的值。
对于 PERCENT 列,您应该仍然是完全安全的,尽管它不太明显。无论如何,我希望这是一个估计。
尽管 python 确实有一个能够计算的十进制类型,但箭头并不代表这一点(numpy 也不代表),除非是低效的 python 对象。
推荐阅读
- laravel - 如何在查询中注入变量 Eager Loads
- r - 将类类型写入数据框列的函数
- python - 无法使用 cron 运行 Python 程序:无法连接到 X 服务器
- c# - OmniSharp:无法加载文件或程序集 System.Threading.Tasks.Dataflow,版本 = 4.6.3.0
- c - 检查逗号 C 后的数字
- php - 我得到:命令不同步;你现在不能运行这个命令?
- json-server - 没有级联的Json-Server DELETE?
- excel - 使用 VBA 引用单独工作表的索引/匹配公式
- c++ - 为什么会调用这个 dangling-gsl 警告?
- pytorch-lightning - 如何在 PyTorch Lightning 中获得所有时期的逐步验证损失曲线