加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – UDF的vs Spark sql vs列表达式性能优化

发布时间:2020-12-16 18:29:11 所属栏目:安全 来源:网络整理
导读:我知道UDF是Spark的完整黑盒子,不会尝试优化它.但是Column类型及其功能的使用将列在:( https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.sql.Column) 使该功能“适合”Catalyst Optimizer? 例如,UDF通过向现有列添加1来创建新
我知道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")

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

解决方法

通过一个简单的内存中的6个记录集,第二个和第三个选项产生相对相同的~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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读