我有相当大(高达约 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
这些花费了疯狂的时间,尽管声称它应该只读取过滤器指定的子集。