2017-01-03 140 views
2

我正在使用spark 2.0從parquet文件中讀取數據。spark中的reducebykey和aggregatebykey Dataframe

val Df = sqlContext.read.parquet("c:/data/parquet1") 
val dfSelect= Df. 
     select(
     "id", 
     "Currency", 
     "balance" 

    ) 



val dfSumForeachId=dfSelect.groupBy("id").sum("balance") 
val total=dfSumForeachId.agg(sum("sum(balance)")).first().getDouble(0) 

爲了獲得總餘額值,這是在數據框中使用first()操作得到它的最好方法嗎?

在spark 2.0中使用groupby key是否正確,它是否具有與rdd上的groupbykey相同的性能問題,就像它需要通過網絡混洗整個數據然後執行聚合或聚合在本地執行,如reducebykey在早期版本的火花

感謝

回答

3

獲得通過使用數據首先是獲取數據的一個完全有效的方式。這就是說,這樣做:

val total = dfSelect.agg(sum("balance")).first().getDouble(0) 

可能會讓你獲得更好的總體性能。

按鍵和按鍵減少工作完全相同的原因相同的原因以前的版本。按鍵分組不會對您想要執行的操作做出任何假設,因此無法知道如何按鍵進行部分聚合。

當你做數據框groupby和總結你實際上是通過+選項減少鍵和你做的第二個聚合是減少與+。這說明數據框更高效地完成了它,因爲知道完成了什麼工作,它可以執行許多優化,例如整個階段的代碼生成。

+0

感謝您的解釋 – baiduXiu