Apache spark 火花:功能上的过滤器未按下

Apache spark 火花:功能上的过滤器未按下,apache-spark,Apache Spark,我正在运行一个spark作业(scala),将列转换为上限并过滤其值 val udfExampleDF = spark.read.parquet("a.parquet") udfExampleDF.filter(upper(col("device_type"))==="PHONE").select(col("device_type")).show() 我看到这个过滤器没有被按下。下面是实际计划的样子 == Phys

我正在运行一个spark作业(scala),将列转换为上限并过滤其值

val udfExampleDF = spark.read.parquet("a.parquet")
udfExampleDF.filter(upper(col("device_type"))==="PHONE").select(col("device_type")).show()
我看到这个过滤器没有被按下。下面是实际计划的样子

== Physical Plan ==
CollectLimit 21
+- *(1) Filter (upper(device_type#138) = PHONE)
   +- *(1) FileScan parquet [device_type#138] Batched: true, Format: Parquet, Location: InMemoryFileIndex[a.parquet, PartitionFilters: [], PushedFilters: [], ReadSchema: struct<orig_device_type:string>
==物理计划==
收藏限额21
+-*(1)过滤器(上部(装置#型#138)=电话)
+-*(1)文件扫描拼花[device_type#138]批处理:true,格式:拼花,位置:InMemoryFileIndex[a.parquet,分区过滤器:[],PushedFilters:],ReadSchema:struct
但是,如果我只是过滤而没有上部,过滤器会被向下推


知道为什么会这样吗。我假设在所有情况下都会按下这些过滤器。感谢您的帮助。

由于谓词下推尝试删除逻辑运算符并将它们推送到数据源,在我们的例子中,从
过滤器到
文件扫描拼花
,它必须使用原始列值

从理论上讲,如果其他文件格式支持使用更改的列值进行过滤,那么它可能会起作用(不确定
PushDownPredicate
是否支持这种过滤,即使存在这样的文件格式)

要解决您的问题,可以通过在方程的另一侧生成动态值来解决此问题,尽管有几个条件,但速度会快得多(尝试将更频繁的值放在第一个条件中):

您还可以在数据摄取中统一列值始终为
PHONE
,即在写入拼花文件之前,应用
upper
功能,然后按如下方式过滤:

udfExampleDF.filter(col("device_type")==="PHONE").select(col("device_type")).show()

由于谓词下推尝试删除逻辑运算符并将其推送到数据源,因此在我们的示例中,从
过滤器
文件扫描拼花
,它必须使用原始列值

从理论上讲,如果其他文件格式支持使用更改的列值进行过滤,那么它可能会起作用(不确定
PushDownPredicate
是否支持这种过滤,即使存在这样的文件格式)

要解决您的问题,可以通过在方程的另一侧生成动态值来解决此问题,尽管有几个条件,但速度会快得多(尝试将更频繁的值放在第一个条件中):

您还可以在数据摄取中统一列值始终为
PHONE
,即在写入拼花文件之前,应用
upper
功能,然后按如下方式过滤:

udfExampleDF.filter(col("device_type")==="PHONE").select(col("device_type")).show()

谢谢。似乎没有办法直接使用函数和过滤器下推。谢谢。似乎没有办法直接使用函数和过滤器下推。