我知道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")
他们之间的表现有什么不同吗?
答案 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()
答案 1 :(得分:-3)
是的,他们是不同的,
第一个是一个udf,它是一个闪光的块盒。
第二个不是udf而只是使用spark
的内置函数