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 SQL中的DataFrame的创建

如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区

Spark中的DataFrame是什么?以及如何构建DataFrame?(附案例)

从 Spark 中的 DataFrame 中过滤和选择数据

如何在 Spark Scala 中将 WrappedArray 转换为 List?

如何从 Spark 2.0 中的 DataFrame 列创建数据集?