UDF与Spark sql vs列表达式性能优化

时间:2017-08-03 17:51:19

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

我知道UDF是Spark的完整黑盒子,不会尝试优化它。但Column类型及其功能的使用是否会列在:(https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.sql.Column)中 使功能"符合条件"对于Catalyst Optimizer?。

例如,UDF通过向现有列添加1来创建新列

val addOne = udf( (num: Int) => num + 1 )
df.withColumn("col2", addOne($"col1"))

使用Column类型的相同功能:

def addOne(col1: Column) = col1.plus(1)
df.withColumn("col2", addOne($"col1"))

spark.sql("select *, col1 + 1 from df")

他们之间的表现有什么不同吗?

2 个答案:

答案 0 :(得分:3)

在一个简单的6个记录的内存集中,第2和第3个选项产生相对相同的~70毫秒的性能,这比第一个(使用UDF - 0.7秒)好得多

val addOne = udf( (num: Int) => num + 1 )
val res1 = df.withColumn("col2", addOne($"col1"))
res1.show()
//df.explain()

def addOne2(col1: Column) = col1.plus(1)
val res2 = df.withColumn("col2", addOne2($"col1"))
res2.show()
//res2.explain()

val res3 = spark.sql("select *, col1 + 1 from df")
res3.show()

<强>时间轴: 前两个阶段用于UDF选项,后两个用于第二个选项,最后两个用于spark SQL: Timeline - first two stages are for UDF, next two for the second option, and last two for spark sql

在所有三种方法中,shuffle写入完全相同(354.0 B),而持续时间的主要差异是使用UDF时执行程序的计算时间: Executor compute time when using UDF

答案 1 :(得分:-3)

是的,他们是不同的,

第一个是一个udf,它是一个闪光的块盒。

第二个不是udf而只是使用spark

的内置函数