我使用spark 2.0从镶木地板文件中读取数据。
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键是没关系的,它是否与rdd上的groupbykey具有相同的性能问题,就像它需要通过网络对整个数据进行混洗然后执行聚合或聚合在本地执行,如reducebykey in早期版本的火花
由于
答案 0 :(得分:3)
首先使用数据获取数据是一种非常有效的数据获取方式。那说,做:
val total = dfSelect.agg(sum("balance")).first().getDouble(0)
可能会让你获得更好的表现。
按键分组并按键工作减少与以前版本完全相同,原因相同。按键分组不会对您要执行的操作做出任何假设,因此无法知道如何按键减少进行部分聚合。
当你使用+选项进行数据帧groupby和sum时,你实际上正在使用键进行reduce,而你使用+进行第二次聚合。那就是说数据帧更有效率,因为知道完成了什么,它可以执行许多优化,例如整个阶段代码生成。