过滤火花数据框选项

时间:2017-03-21 07:37:50

标签: apache-spark apache-spark-sql spark-dataframe

我正在研究两种不同的数据帧过滤,我看不出它们的作用有什么不同:

选项1:

df.filter(df.col("myColumn").equalTo("test"))

选项2:

df.filter(col("myColumn").equalTo("test"))

从instanciated数据帧获取Column对象与仅使用sparks sql框架中的col函数之间有区别吗?

2 个答案:

答案 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"))

是访问数据框列的默认方式。

相关问题