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
),您有两个选择: reduceByKey
或 aggregateByKey
(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