我正在研究两种不同的数据帧过滤,我看不出它们的作用有什么不同:
选项1:
df.filter(df.col("myColumn").equalTo("test"))
选项2:
df.filter(col("myColumn").equalTo("test"))
从instanciated数据帧获取Column
对象与仅使用sparks sql框架中的col
函数之间有区别吗?
答案 0 :(得分:2)
如果我们比较计划,它们完全相同:
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]
所以直接回答你的问题: 不,两种语法的执行方式似乎没有区别
答案 1 :(得分:0)
在执行计划中没有区别。
唯一的区别是您如何访问这些特定列。 默认情况下,您无法使用
访问数据框的列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"))
是访问数据框列的默认方式。