首页 > 解决方案 > 使用 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":{}}]}'}

标签: pythondaskparquetpyarrow

解决方案


我不相信你会通过使用浮点数(双精度,64 位)来为两位小数位列丢失精度,尽管你得到稍微不同的值。

对于 PERCENT 列,您应该仍然是完全安全的,尽管它不太明显。无论如何,我希望这是一个估计。

尽管 python 确实有一个能够计算的十进制类型,但箭头并不代表这一点(numpy 也不代表),除非是低效的 python 对象。


推荐阅读