Apache Spark 转换:groupByKey vs reduceByKey vs aggregateByKey

Posted

技术标签:

【中文标题】Apache Spark 转换:groupByKey vs reduceByKey vs aggregateByKey【英文标题】:Apache Spark Transformations: groupByKey vs reduceByKey vs aggregateByKey 【发布时间】:2017-03-15 10:10:48 【问题描述】:

这三个 Apache Spark 转换有点令人困惑。有什么方法可以确定何时使用哪一种,何时避免使用?

【问题讨论】:

注意还有combineByKey 【参考方案1】:

我认为official guide 解释得很好。

我将强调差异(您的 RDD 类型为 (K, V)):

    如果您需要保留这些值,请使用groupByKey 如果您不需要保留这些值,但您需要获取有关每个组的一些汇总信息(原始 RDD 的项目,具有相同的K),您有两个选择: reduceByKeyaggregateByKey (reduceByKey 有点特别 aggregateByKey) 2.1 如果你可以提供一个以(V, V) 为输入并返回V 的操作,这样该组的所有值都可以减少为same 类型,然后使用reduceByKey。因此,您将拥有相同的 (K, V) 类型的 RDD。 2.2 如果您不能提供此聚合操作,则使用aggregateByKey。当您将值减少为 another 类型时,就会发生这种情况。因此,您将获得(K, V2)

【讨论】:

【参考方案2】:

除了@Hlib 的回答,我还想补充几点。

groupByKey() 只是根据键对数据集进行分组。 reduceByKey() 类似于 分组 + 聚合。我们可以说 reduceBykey() 相当于dataset.group(...).reduce(...)aggregateByKey() 在逻辑上与 reduceByKey() 相同,但它允许您返回不同类型的结果。换句话说,它允许您将输入作为 type x 并将结果聚合为 type y。例如 (1,2),(1,4) 作为输入,(1,"six") 作为输出。

【讨论】:

以上是关于Apache Spark 转换:groupByKey vs reduceByKey vs aggregateByKey的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中执行聚合函数时出错:ArrayType 无法转换为 org.apache.spark.sql.types.StructType

从 org.apache.spark.sql.Dataset 转换为 CoordinateMatrix

带有 Cassandra 的 Apache Spark 1.5:类转换异常

转换CassandraTableScanRDD org.apache.spark.rdd.RDD

Spark - groupByKey over reduceByKey 的用例是啥

如何将 cassandraRow 转换为 Row(apache spark)?