高效读取部分分区数据集

问题描述 投票:0回答:1

我有相当大(高达约 300Gb)的数据集,由 parquet 格式(压缩)的分区存储。

我正在尝试找到一种有效的方法将数据集的各个部分(由一组过滤器定义)读取到 pandas 中。 现在的做法是

result = ds.dataset(dataset_storage_root, format="parquet", partitioning='hive').scanner(
    columns=columns,
    filter=filters
).to_table().to_pandas()

虽然这有效,但速度相当慢(我认为这是因为它实际上读取了完整的数据集,然后才应用过滤器,迭代每一行)。 我所说的相当慢是指大约 13 秒,考虑到数据集大小,这还可以,但考虑到我需要检索的实际数据量,这很荒谬。

手动确定数据的子文件夹并读取这部分内容进行比较大约需要 9 毫秒。缺点是我需要手动添加分区列和值,并使用过滤和模式处理相当多的极端情况。

我想一定有一种方法可以通过 API 高效地做到这一点。

我已经尝试过但令我失望的是:

df_pandas = pd.read_parquet(dataset_storage_root, engine="pyarrow", filters=filters)

需要1m 23s

df_pq = pq.read_table(dataset_storage_root, filters=filters)

需要1m 22s

这些花费了疯狂的时间,尽管声称它应该只读取过滤器指定的子集。

python pandas parquet partitioning pyarrow
1个回答
0
投票

fastparquet
是大数据工作流程,旨在支持Parquet文件格式,支持过滤并可用于创建
pandas.DataFrame
, 请测试它对于您的用例来说是否可以接受。

© www.soinside.com 2019 - 2024. All rights reserved.