gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:37:01 24 4
gpt4 key购买 nike

我明白 UDF s 是一个完整的 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 条记录的简单内存集上,第 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

关于scala - UDF vs Spark sql vs 列表达式性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45491339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com