我有一个表,它是df,也有一个用
创建的视图table.createOrReplaceTempView("table")
查询是
spark.sql("SELECT column1 from TABLE where column2 = 'VALUE'")
我想将查询重写为
TABLE.filter(TABLE("column2") === "value").select(col("column1"))
那么哪个查询比普通spark.sql更快,或者使用filter并选择?使用大型数据集时。
答案 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]
看起来根本没有区别...