首页 > 解决方案 > 使用 Dask 和 pyarrow-dataset 引擎读取 Spark 编写的分区 parquet 数据集

问题描述

我想读取由 Spark 使用 Dask 和 pyarrow-dataset 引擎编写的分区拼花数据集。理想情况下,我将能够提供要阅读的镶木地板文件列表。这是一个简单的测试示例,举例说明了我在更大的数据集上遇到的一些错误和意外行为:

使用 spark 写入数据:

df = spark.createDataFrame(
[("A", 1, 4),
 ("B", 2, 5),
 ("C", 3, 6)
],["id", "col1", "col2"])

home_dir = "/home/xxx/"

df \
.write.format("parquet") \
.mode("overwrite") \
.partitionBy("id") \
.save(home_dir + "parquet_dataset")

使用 pyarrow 引擎和目录的 Dask 工作:

import os
from glob import glob
import pyarrow.parquet as pq
import pyarrow.dataset as ds
import dask.dataframe as dd

dd.read_parquet(path=home_dir + "parquet_dataset", engine="pyarrow").compute()

结果1

带有文件列表的 Dask 删除了分区列

paths = [y for x in os.walk(home_dir + "parquet_dataset") for y in glob(os.path.join(x[0],'*.parquet'))]
dd.read_parquet(path=paths, engine="pyarrow").compute()

结果2

使用 pyarrow-dataset 引擎的 Dask 会导致错误:

dd.read_parquet(path=home_dir + "parquet_dataset", engine="pyarrow-dataset")
or
dd.read_parquet(path=paths, engine="pyarrow-dataset") # This is ideally what I am after

ValueError:列中不应存在分区。类别:['col1', 'col2', 'id'] | 分区:['id']

但是以下 pyarrow 方法可以正常工作:

pq.read_table(paths).to_pandas()
ds.dataset(source=paths, partitioning="hive", format="parquet").to_table().to_pandas()

是否有可能使用 Dask 以这种格式的镶木地板、分区和使用文件列表进行理想化来获得相同的行为?任何关于我做错了什么的帮助或想法将不胜感激。

标签: apache-sparkpyarrowdask-dataframe

解决方案


推荐阅读