是否可以使用 Dask 和 Fastparquet 阅读器读取手动分区的 Parquet 数据集?

Posted

技术标签:

【中文标题】是否可以使用 Dask 和 Fastparquet 阅读器读取手动分区的 Parquet 数据集?【英文标题】:Is it possible to read a Parquet dataset partitioned by hand using Dask with the Fastparquet reader? 【发布时间】:2021-01-22 19:43:35 【问题描述】:

我创建了一个 Parquet 数据集,分区如下:

2019-taxi-trips/
    - month=1/
        - data.parquet
    - month=2/
        - data.parquet
    ...
    - month=12/
        - data.parquet

该组织遵循 Hive Metastore 使用的 Parquet dataset partitioning convention。此分区方案是手动生成的,因此目录树中的任何位置都没有_metadata 文件。

我现在想将此数据集读入 Dask。

如果数据位于本地磁盘上,则以下代码有效:

import dask.dataframe as dd
dd.read_parquet(
    "/Users/alekseybilogur/Desktop/2019-taxi-trips/*/data.parquet",
    engine="fastparquet"
)

我将这些文件复制到 S3 存储桶(通过 s3 sync;分区文件夹是存储桶中的***键 like so),并尝试使用相同的基本功能从云存储中读取它们:

import dask.dataframe as dd; dd.read_parquet(
    "s3://2019-nyc-taxi-trips/*/data.parquet",
    storage_options=
        "key": "...",
        "secret": "..."
    ,
    engine="fastparquet")

这引发了IndexError: list index out of range。 Full stack trace here.

目前是否可以直接从 AWS S3 读取这样的数据集?

【问题讨论】:

这听起来像是一个错误,你应该在 dask 跟踪器上发布 归档为github.com/dask/dask/issues/6713。 【参考方案1】:

fastparquet 中当前存在一个错误,导致此代码无法正常工作。详情请见Dask GH#6713。

与此同时,在解决此错误之前,解决此问题的一个简单方法是改用 pyarrow 后端。

dd.read_parquet(
    "s3://2019-nyc-taxi-trips/*/data.parquet",
    storage_options=
        "key": "...",
        "secret": "..."
    ,
    engine="pyarrow"
)

【讨论】:

以上是关于是否可以使用 Dask 和 Fastparquet 阅读器读取手动分区的 Parquet 数据集?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dask 从多个 Python 进程编写 Parquet 文件

带有pyarrow内存的dask read_parquet爆炸

如何将单个镶木地板文件从 s3 读入 dask 数据帧?

生成镶木地板文件 - R 和 Python 之间的差异

是否可以从 Dask 读取镶木地板元数据?

与 Dask 共享内存