我有一个表是一个df,也有一个创建的视图
table.createOrReplaceTempView("table")
而查询是
spark.sql("SELECT column1 from TABLE where column2 = 'VALUE'")
我想将查询重写为
TABLE.filter(TABLE("column2") === "value").select(col("column1"))
那么哪个查询比普通的spark.sql要快得多,还是用filter和select?使用大型数据集时。
取决于你的用例只需尝试两个快速工作的最适合你的用法!
我建议你使用
1.spark.time(df.filter(“”).select(“”))
2.spark.time(spark.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]
看起来根本没有区别......
我可能错了,但它完全一样。 Spark将读取两个代码,通过Catalyst解释它并通过Tungsten优化生成RDD代码。
主要的变化是编码和调试的简易性。使用spark.sql,您在编译时不会有任何关于错误或输入错误的信息...
使用.filter,.select更容易缩进,阅读等...
TLDR:性能明智=相同/编码明智= spark.sql更糟糕