这是更快的spark.sql或df.filter(“”)。select(“”)。使用scala

时间:2018-09-07 06:24:35

标签: scala apache-spark apache-spark-sql

我有一个表,它是df,也有一个用

创建的视图
table.createOrReplaceTempView("table")

查询是

spark.sql("SELECT column1 from TABLE where column2 = 'VALUE'")

我想将查询重写为

TABLE.filter(TABLE("column2") === "value").select(col("column1"))

那么哪个查询比普通spark.sql更快,或者使用filter并选择?使用大型数据集时。

3 个答案:

答案 0 :(得分:3)

我可能错了,但这是完全一样的。 Spark将读取两个代码,通过Catalyst对其进行解释,并通过钨优化生成RDD代码。

主要变化是简化了编码和调试。使用spark.sql,在编译时您不会有任何有关错误或键入错误的信息...

使用.filter,.select更加容易缩进,读取等...

TLDR:性能明智=相同/编码明智= spark.sql差很多

答案 1 :(得分:1)

根据您的用例,只需尝试两种都能快速工作的方法,这对您来说是最合适的!

我建议您使用

1.spark.time(df.filter(“”).select(“”)) 

2.spark.time(spark.sql("")) 

您可以打印出时间,并使用花费最少时间在代码中执行的时间来更快地运行它。

答案 2 :(得分:1)

我假设,如果他们的物理执行计划完全相同,那么性能也将相同。因此,让我们在Spark 2.2.0上进行测试:

scala> import spark.implicits._
import spark.implicits._

scala> case class Record(column1: String, column2: String)
defined class Record

scala> val table = List(Record("foo", "value"), Record("bar", "notvalue")).toDF
table: org.apache.spark.sql.DataFrame = [column1: string, column2: string]

scala> table.createOrReplaceTempView("table")

scala> val a = spark.sql("SELECT column1 from TABLE where column2 = 'value'")
a: org.apache.spark.sql.DataFrame = [column1: string]

scala> val b = table.filter(table("column2") === "value").select(col("column1")) 
b: org.apache.spark.sql.DataFrame = [column1: string]

scala> a.explain()
== Physical Plan ==
*Project [column1#41]
+- *Filter (isnotnull(column2#42) && (column2#42 = value))
   +- LocalTableScan [column1#41, column2#42]

scala> b.explain()
== Physical Plan ==
*Project [column1#41]
+- *Filter (isnotnull(column2#42) && (column2#42 = value))
   +- LocalTableScan [column1#41, column2#42]

看起来根本没有区别...