首页 > 解决方案 > Spark 不推送过滤器/分区,即 PushedFilters 和 PartitionFilter 为空)

问题描述

火花版本:2.4.4

数据按date_col列分区

第一个例子:

df.filter("datetime_col >= current_timestamp - interval 48 hours and date_col >= date_format(current_timestamp - interval 48 hours,"yyyyMMdd")")

对于上述数据框过滤器,在物理计划中 -

..., PartitionCount: 31, PartitionFilters: [isnotnull(date_col#245), (date_col#245 >= 20210929)], PushedFilters: [IsNotNull(datetime_col), GreaterThanOrEqual(datetime_col,2021-09-29 07:16:18.706)] .....

因此,在这种情况下,PartitionFilter 和 PushedFilter 都存在,从而提高了性能,因为它们将被下推并且数据首先会更小。

第二个例子:

df.filter("(datetime_col >= current_timestamp - interval 48 hours and date_col >= date_format(current_timestamp - interval 48 hours,"yyyyMMdd")) 
or ((datetime_col >= current_timestamp - interval 60 hours and date_col >= date_format(current_timestamp - interval 60 hours,"yyyyMMdd")))")

在这种情况下,Physical 计划没有任何 PushedFilter 和 PartitionFilters。

....PartitionCount: 1821, PartitionFilters: [], PushedFilters: [], R....

相关 Parquet Confs 的值。-

"spark.sql.parquet.filterPushdown", "true" 
"spark.sql.optimizer.nestedSchemaPruning.enabled","false"

我不明白为什么会这样。

这两个示例之间的唯一区别是,在第一个示例中,我仅使用 1 个日期过滤器进行过滤,但在第二个示例中,数据帧上应用了 2 个过滤器。

除了 My Idea 之外,在第二个示例中,我正在应用一个过滤器 where date_col >= 20210929 or date_col >= 20210928,它可以简化为 -date_col >= 20210928即较低的值。

提前致谢。

标签: scalaapache-spark

解决方案


推荐阅读