2017-01-03 102 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