2017-08-03 203 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和只是使用內置的火花