哪个是更快的火花.sql或 df.filter( " " ).select( " " )。使用 Scala



我有一个表,它是一个 df,它也有一个视图

table.createOrReplaceTempView("table")

查询是

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

我想将查询重写为

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

那么哪个查询比普通火花快得多.sql或者使用过滤器并选择? 使用大型数据集时。

我假设如果他们的物理执行计划完全相同,性能也会相同。因此,让我们在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]

看起来完全没有区别...

根据您的用例,只需尝试它们,哪种快速工作最适合您!

我建议你使用

1.spark.time(df.filter(“”).select(“”)) 
2.spark.time(spark.sql("")) 

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

我可能是错的,但它是完全相同的。Spark将读取这两个代码,通过Catalyst解释它,并通过Tungsten优化生成RDD代码。

主要变化是易于编码和调试。使用 spark.sql,您将在编译时获得有关错误或类型错误的任何信息......

使用 .filter,.select 更容易缩进、阅读等......

TLDR : 性能明智 = 相同/编码明智 = 火花.sql差得多

最新更新