2017-08-03 43 views
4

我知道UDF s是Spark的完整黑盒,并且不会尝试优化它。但使用Column类型及其功能列在:(https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.sql.Column
使功能“符合”Catalyst Optimizer?。UDF's vs Spark sql vs列表达式性能优化

例如,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") 

将性能之间有任何差异恩他们?

回答

1

的功能在一个简单的在存储器组的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选项,接下来的两个第二种选择,并为火花SQL最后两: Timeline - first two stages are for UDF, next two for the second option, and last two for spark sql

在这三种方法中,随机写操作是完全一样的(354.0 B),而在时间的主要区别是执行计算时间使用UDF时: Executor compute time when using UDF

+1

我不知道如果数据集选择是为在你的例子'df.as [Int] .map(num =>(num,num + 1))中,UDF方法不好[ –

+0

]对不起,延迟@DanieldePaula和@YosiDahari,我把一个大的'UDF'转换为只使用'Column'类型,我确实看到了一些改进。我仍然不知道它将如何处理大数据。 – vdep

-2

是的,他们是不同的,

第一个是udf这是一个块火花。

第二不是一个UDF和只是使用内置的火花