spark Dataframe 中的 reducebykey 和 aggregatebykey
Posted
技术标签:
【中文标题】spark Dataframe 中的 reducebykey 和 aggregatebykey【英文标题】:reducebykey and aggregatebykey in spark Dataframe 【发布时间】:2017-01-03 06:58:01 【问题描述】:我正在使用 spark 2.0 从 parquet 文件中读取数据。
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早期版本的火花
谢谢
【问题讨论】:
【参考方案1】:通过先使用来获取数据是一种完全有效的获取数据的方式。也就是说,做:
val total = dfSelect.agg(sum("balance")).first().getDouble(0)
可能会给你更好的性能来获得总数。
group by key 和 reduce by key 的工作原理与以前的版本完全相同,原因相同。 group by key 不对您想要执行的操作做出任何假设,因此无法像 reduce by key 那样知道如何进行部分聚合。
当您执行 dataframe groupby 和 sum 时,您实际上是在使用 + 选项进行按键缩减,而您所做的第二个聚合是使用 + 进行缩减。也就是说,dataframe 可以更有效地执行此操作,因为确切地知道做了什么,它可以执行许多优化,例如整个阶段的代码生成。
【讨论】:
以上是关于spark Dataframe 中的 reducebykey 和 aggregatebykey的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区
Spark中的DataFrame是什么?以及如何构建DataFrame?(附案例)