我正在查看两种不同的数据帧过滤,但我看不到它们的作用有何不同:
选项 1:
df.filter(df.col("myColumn").equalTo("test"))
选项 2:
df.filter(col("myColumn").equalTo("test"))
从实例化数据帧获取Column
对象与仅使用 sparks sql 框架中的col
函数之间有区别吗?
如果我们比较计划,它们是完全相同的:
val df = sc.parallelize(Seq((1,"a",123),(2,"b",456))).toDF("col1","col2","col3")
scala> df.filter(df.col("col2").equalTo("b")).explain
== Physical Plan ==
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5]
Filter (_2#1 = b)
Scan PhysicalRDD[_1#0,_2#1,_3#2]
scala> df.filter(col("col2").equalTo("b")).explain
== Physical Plan ==
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5]
Filter (_2#1 = b)
Scan PhysicalRDD[_1#0,_2#1,_3#2]
我也包括了更多方法来制作相同的解释计划以增加乐趣
scala> df.filter(df("col2").equalTo("b")).explain
== Physical Plan ==
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5]
Filter (_2#1 = b)
Scan PhysicalRDD[_1#0,_2#1,_3#2]
scala> df.filter(df("col2") === "b" ).explain
== Physical Plan ==
TungstenProject [_1#0 AS col1#3,_2#1 AS col2#4,_3#2 AS col3#5]
Filter (_2#1 = b)
Scan PhysicalRDD[_1#0,_2#1,_3#2]
所以直接回答你的问题:不,这两种语法的执行方式似乎没有区别
在执行计划中没有区别。
唯一的区别是访问这些特定列的方式。默认情况下,您无法使用 访问数据帧的列
df.filter(col("myColumn").equalTo("test"))
它会说"找不到col的值"。要使用上述语法,您需要导入以下内容。
import org.apache.spark.sql.functions._
rdd.filter(col("myColumn").equalTo("test"))
通过导入上述 Spark 将了解您正在尝试引用您正在执行过滤器的同一数据帧的列。
另一方面
rdd.filter(rdd.col("myColumn").equalTo("test"))
是访问数据帧列的默认方法。