无分区列性能的 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
.explain(true)
中的解释计划来查看所有这些详细信息
检查过滤器是否下推enabled or not
:
spark.sql("set spark.sql.parquet.filterPushdown").show(10,false)
//+--------------------------------+-----+
//|key |value|
//+--------------------------------+-----+
//|spark.sql.parquet.filterPushdown|true |
//+--------------------------------+-----+
【讨论】:
以上是关于无分区列性能的 Spark 下推过滤器的主要内容,如果未能解决你的问题,请参考以下文章