SQL和withColumn之间的性能

时间:2019-09-09 13:39:24

标签: dataframe apache-spark pyspark

假设我创建以下数据框:

dt = pd.DataFrame(np.array([[1,5],[2,12],[4,17]]),columns=['a','b'])
df = spark.createDataFrame(dt)

我想创建第三列c,这是这两列的总和。我有以下两种方式。

Spark中的withColumn()方法:

df1 = df.withColumn('c', df.a + df.b)

或使用sql:

df.createOrReplaceTempView('mydf')
df2 = spark.sql('select *, a + b as c from mydf')

虽然两者都能得出相同的结果,但是哪种方法计算速度更快?

此外,sql与spark用户定义函数相比如何?

1 个答案:

答案 0 :(得分:2)

  

虽然两者都能得出相同的结果,但是哪种方法计算速度更快?

看看执行计划:

df1.explain()
#== Physical Plan ==
#*(1) Project [a#0L, b#1L, (a#0L + b#1L) AS c#4L]
#+- Scan ExistingRDD[a#0L,b#1L]

df2.explain()
#== Physical Plan ==
#*(1) Project [a#0L, b#1L, (a#0L + b#1L) AS c#8L]
#+- Scan ExistingRDD[a#0L,b#1L]

由于这些相同,因此两种方法相同。

通常来说,使用withColumnspark-sql相对于其他方法没有计算优势。如果代码编写正确,则基础计算将相同。

在某些情况下,使用spark-sql来表达某些内容会更容易,例如,如果您想use a column value as a parameter to a spark function

  

此外,sql与spark用户定义函数相比如何?

看看这篇文章:Spark functions vs UDF performance?