筛选火花数据帧选项



我正在查看两种不同的数据帧过滤,但我看不到它们的作用有何不同:

选项 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"))

是访问数据帧列的默认方法。

相关内容

  • 没有找到相关文章

最新更新