Apache Spark Transformations:groupByKey vs reduceByKey vs aggregateByKey

时间:2017-03-15 10:10:49

标签: apache-spark rdd

这三个Apache Spark转换很容易混淆。有什么方法可以确定何时使用哪一个以及何时避免使用哪一个?

2 个答案:

答案 0 :(得分:5)

我认为official guide解释得很好。

我将突出显示差异(您有类型(K, V)的RDD):

  1. 如果您需要保留值,请使用groupByKey
  2. 如果你不需要来保留这些值,但是你需要获得一些关于每个组的汇总信息(原始RDD的项目,具有相同的K),你有两个选项:reduceByKeyaggregateByKeyreduceByKey有点特别aggregateByKey
    • 2.1如果您可以提供作为输入(V, V)的操作并返回V,那么该组的所有值都可以减少到一个相同类型的值,然后使用reduceByKey。因此,您将拥有相同(K, V)类型的RDD。
    • 2.2如果您无法提供此聚合操作,请使用aggregateByKey。将值减少到另一个类型时会发生这种情况。因此,您将获得(K, V2)

答案 1 :(得分:1)

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

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