Проблема при чтении файла паркета с различными типами данных, такими как десятичный формат, при использовании Dask read parquet - PullRequest
0 голосов
/ 10 марта 2020

У меня есть некоторые файлы паркета, созданные Spark для преобразования файла AVRO в файл паркета. И эти паркетные файлы содержат разные типы данных, такие как decimal, int, string, boolean. Но когда я читаю этот файл, используя dd.read_parquet с механизмом pyarrow, кроме int, все остальное преобразуется в типы данных объекта и вызывает проблему в вычислениях арифметических c. И я попробовал с типом float для десятичных столбцов, но это потеряет точность. Любая идея, как читать значения без потери точности?

Схема для файла паркета

<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":{}}]}'}

1 Ответ

0 голосов
/ 10 марта 2020

Я не верю, что вы потеряете точность, используя плавающую точку (двойную, 64-битную) для столбцов с двумя десятичными знаками, хотя вы получите немного отличающихся значений.

Для столбца PERCENT вы все равно должны быть в полной безопасности, хотя это менее очевидно. В любом случае, я ожидаю, что это приблизительная оценка.

Хотя python имеет десятичный тип, способный к вычислениям, стрелка не представляет этого (как и numpy), за исключением неэффективного python объекты.

...