Потеря информации об индексе при использовании dask.dataframe.to_parquet () с разделением - PullRequest
0 голосов
/ 05 февраля 2020

Когда я использовал dask = 1.2.2 с pyarrow 0.11.1, я не наблюдал такого поведения. После обновления (dask = 2.10.1 и pyarrow = 0.15.1) я не могу сохранить индекс, когда использую метод to_parquet с заданными аргументами partition_on и write_index. Здесь я создал минимальный пример, который показывает проблему:

from datetime import timedelta
from pathlib import Path

import dask.dataframe as dd
import pandas as pd

REPORT_DATE_TEST = pd.to_datetime('2019-01-01').date()
path = Path('/home/ludwik/Documents/YieldPlanet/research/trials/')

observations_nr = 3
dtas = range(0, observations_nr)
rds = [REPORT_DATE_TEST - timedelta(days=days) for days in dtas]
data_to_export = pd.DataFrame({
    'report_date': rds,
    'dta': dtas,
    'stay_date': [REPORT_DATE_TEST] * observations_nr,
    }) \
    .set_index('dta')

data_to_export_dask = dd.from_pandas(data_to_export, npartitions=1)

file_name = 'trial.parquet'
data_to_export_dask.to_parquet(path / file_name,
                               engine='pyarrow',
                               compression='snappy',
                               partition_on=['report_date'],
                               write_index=True
                              )

data_read = dd.read_parquet(path / file_name, engine='pyarrow')
print(data_read)

, которая дает:

| | stay_date  |dta| report_date|
|0| 2019-01-01 | 2 | 2018-12-30 |
|0| 2019-01-01 | 1 | 2018-12-31 |
|0| 2019-01-01 | 0 | 2019-01-01 |

Я не видел описанного где-либо в документации по dask.

Кто-нибудь знает, как сохранить индекс при разбиении данных паркета?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Проблема была в бэкэнде пиарроу. Я отправил отчет об ошибке на их веб-странице JIRA: https://issues.apache.org/jira/browse/ARROW-7782

0 голосов
/ 05 февраля 2020

Может показаться, что я пытаюсь обойти этот вопрос, но я предлагаю разделить его по индексу. Это также обеспечит неперекрывающиеся индексы в разделах.

Это будет похоже на dd.from_pandas(data_to_export, npartitions=3), а затем пропустите partition_on и write_index в to_parquet. Индекс должен быть отсортирован.

Это сохраняет индекс и правильно устанавливает деления.

Обратите внимание, что вам не гарантируется точное количество запрашиваемых разделов с помощью partitions, особенно не с небольшими наборами данных.

...