使用 Dask 的 Parquet 谓词下推过滤
Parquet predicate pushdown filtering with Dask
如何在读取 Dask DataFrame 时应用基于 Parquet min/max 值的谓词下推过滤器?
假设您有一个包含 4 个 Parquet 文件的数据湖,每个文件都有 nickname
和 age
列。 table 显示每个文件的 Parquet 文件名、年龄最小值和年龄最大值。
| File | min | max |
|---------------|-----|-----|
| pets1.parquet | 1 | 9 |
| pets2.parquet | 3 | 9 |
| pets3.parquet | 2 | 4 |
| pets4.parquet | 7 | 12 |
假设您要对年龄大于 10 的所有数据行进行分析。您知道可以跳过 pets1.parquet
、pets2.parquet
和 pets3.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
参数有用吗?你能提供一个代码片段吗?
是的,过滤器参数正是您想要的,如下所示:
dask.dataframe.read_parquet(路径, 过滤器=[('age', ">", 10)], ...)
这将跳过 row-groups/files 其中 none 行可以满足条件。
请注意,要使其正常工作,您可能需要 gather_statistics=True
或全局 _metadata
文件(其存在将取决于数据的写入方式)。
如何在读取 Dask DataFrame 时应用基于 Parquet min/max 值的谓词下推过滤器?
假设您有一个包含 4 个 Parquet 文件的数据湖,每个文件都有 nickname
和 age
列。 table 显示每个文件的 Parquet 文件名、年龄最小值和年龄最大值。
| File | min | max |
|---------------|-----|-----|
| pets1.parquet | 1 | 9 |
| pets2.parquet | 3 | 9 |
| pets3.parquet | 2 | 4 |
| pets4.parquet | 7 | 12 |
假设您要对年龄大于 10 的所有数据行进行分析。您知道可以跳过 pets1.parquet
、pets2.parquet
和 pets3.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
参数有用吗?你能提供一个代码片段吗?
是的,过滤器参数正是您想要的,如下所示:
dask.dataframe.read_parquet(路径, 过滤器=[('age', ">", 10)], ...)
这将跳过 row-groups/files 其中 none 行可以满足条件。
请注意,要使其正常工作,您可能需要 gather_statistics=True
或全局 _metadata
文件(其存在将取决于数据的写入方式)。