使用带有分区的dask.dataframe.to_parquet()时丢失索引信息

2024-04-20 07:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

当我将dask=1.2.2与pyarrow 0.11.1一起使用时,我没有观察到这种行为。更新后(dask=2.10.1和pyarrow=0.15.1),当我使用带有给定分区的tou-parquet方法和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文档中描述的任何地方

有人知道如何在分割拼花地板数据时保存索引吗


Tags: tofromtestimportreportdatadateindex
2条回答

问题出在pyarrow的后端。我在他们的JIRA网页上提交了一份错误报告: https://issues.apache.org/jira/browse/ARROW-7782

我似乎想回避这个问题,但我的建议是沿着索引进行分区。这还将确保分区中的索引不重叠

这类似于dd.from_pandas(data_to_export, npartitions=3),然后在to_parquet中跳过partition_onwrite_index。必须对索引进行排序

这将保留索引并正确设置分区

请注意,不能保证使用partitions获得所请求的分区的确切数量,尤其是对于小数据集

相关问题 更多 >