Apache spark 火花:功能上的过滤器未按下
我正在运行一个spark作业(scala),将列转换为上限并过滤其值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
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()
谢谢。似乎没有办法直接使用函数和过滤器下推。谢谢。似乎没有办法直接使用函数和过滤器下推。