繁体   English   中英

使用 Dask read parquet 读取具有不同数据类型(如十进制)的镶木地板文件时出现问题

[英]Issue while reading a parquet file with different data types like decimal using Dask read parquet

我有一些由 Spark 将 AVRO 文件转换为 parquet 文件创建的镶木地板文件。 这些镶木地板文件包含不同的数据类型,如十进制、整数、字符串、布尔值。 但是当我使用带有 pyarrow 引擎的 dd.read_parquet 读取这个文件时,除了 int 之外,其他所有内容都被转换为对象数据类型,这会导致算术计算出现问题。 我尝试使用 float dtypes 作为十进制列,但这会降低精度。 知道如何在不失去精度的情况下读取值吗?

镶木地板文件的架构

<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 对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM