使用 Dask 进行 Parquet 谓词下推过滤

Posted

技术标签:

【中文标题】使用 Dask 进行 Parquet 谓词下推过滤【英文标题】:Parquet predicate pushdown filtering with Dask 【发布时间】:2020-08-24 22:38:02 【问题描述】:

在读取 Dask DataFrame 时,如何根据 Parquet 最小值/最大值应用谓词下推过滤器?

假设您有一个包含 4 个 Parquet 文件的数据湖,每个文件都有 nicknameage 列。此表显示每个文件的 Parquet 文件名、年龄最小值和年龄最大值。

| File          | min | max |
|---------------|-----|-----|
| pets1.parquet | 1   | 9   |
| pets2.parquet | 3   | 9   |
| pets3.parquet | 2   | 4   |
| pets4.parquet | 7   | 12  |

假设您想对年龄大于 10 的所有数据行执行分析。您知道在执行此分析时可以跳过 pets1.parquetpets2.parquetpets3.parquet,因为这些文件中的最大年龄小于我们过滤器查询中的最小值。跳过文件可以使某些分析运行得更快。

这是 API 文档中的 read_parquet 方法签名:dask.dataframe.read_parquet(path, columns=None, filters=None, categories=None, index=None, storage_options=None, engine='auto', gather_statistics=None, split_row_groups=None, chunksize=None, **kwargs)

filter 参数有帮助吗?可以给个sn-p代码吗?

【问题讨论】:

【参考方案1】:

是的,filters 参数正是您想要的,类似于以下内容:

dask.dataframe.read_parquet(path, filters=[('age', ">", 10)], ...)

这将跳过没有行满足条件的行组/文件。

请注意,要使其正常工作,您可能需要 gather_statistics=True 或全局 _metadata 文件(其存在取决于数据的写入方式)。

【讨论】:

以上是关于使用 Dask 进行 Parquet 谓词下推过滤的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyArrow + Parquet + Google Cloud Storage 时如何实现谓词下推?

谓词下推

使用 dask read_parquet 方法过滤会产生不需要的结果

SQL 优化技术系列: 谓词下推

谓词下推

谓词下推 vs On 子句