无分区列性能的 Spark 下推过滤器

Posted

技术标签:

【中文标题】无分区列性能的 Spark 下推过滤器【英文标题】:Spark pushdown filter without partition column performance 【发布时间】:2020-08-02 12:21:40 【问题描述】:

当您未在过滤器中包含分区列时,我对 Spark 中的过滤有疑问。

假设我有以下按日期分区的数据:

path/date=20200721/part-0000.parquet
                   part-0001.parquet
                   part-0002.parquet
path/date=20200722/part-0000.parquet
                   part-0001.parquet
                   part-0002.parquet
...

数据有一列名为“action”,其中大约 30% 的数据值为 0,其余数据值为 1

如果我运行以下命令:

spark.read.parquet("s3a://path").filter("action = 0")

spark 是否必须从源中列出并扫描位于“路径”中的所有文件?还是有一些下推过滤?还是 spark 仅在过滤器中存在分区列的情况下应用下推过滤器?

谢谢。

【问题讨论】:

【参考方案1】:

1.spark 是否必须列出并扫描位于“路径”中的所有文件 来源?

Yes,因为您没有过滤分区列 spark 列表并扫描所有文件

2.有一些下推过滤吗?

读取时会在每个文件上应用pushdown filter

3.spark 仅在分区列所在的位置应用下推过滤器 存在于过滤器中?

No,分区过滤器将应用于存在分区列的地方,否则在扫描文件时将应用谓词下推。

partition filter vs pushdown filter

您可以通过查看 spark .explain(true) 中的解释计划来查看所有这些详细信息

检查过滤器是否下推enabled or not

spark.sql("set spark.sql.parquet.filterPushdown").show(10,false)
//+--------------------------------+-----+
//|key                             |value|
//+--------------------------------+-----+
//|spark.sql.parquet.filterPushdown|true |
//+--------------------------------+-----+

【讨论】:

以上是关于无分区列性能的 Spark 下推过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spark中的DataFilter与PushedFilter?

过滤与分区列相关的列时的 Databricks 查询性能

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

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

谓词下推

SPARK最新特性Runtime Filtering(运行时过滤)以及与动态分区裁剪的区别