首页 > 解决方案 > 无分区列性能的 Spark 下推过滤器

问题描述

当您未在过滤器中包含分区列时,我对 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 仅应用过滤器中存在分区列的下推过滤器?

谢谢。

标签: apache-spark

解决方案


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 |
//+--------------------------------+-----+

推荐阅读