reduceByKey 与 groupByKey 与 aggregateByKey 与 combineByKey 之间的火花区别

谁能解释一下 reducebykey、groupbykey、aggregatebykey 和 combinebykey 之间的区别?我读过相关文件,但不明白它们之间的具体区别。

如果您能举例说明,那就太好了。

虽然 reducebykey 和 groupbykey 都会产生相同的答案,但 reduceByKey 示例在大型数据集上的效果更好。 reduceByKey 示例在大型数据集上效果更好。这是因为 因为 Spark 知道它可以在每个

因为 Spark 知道它可以在洗牌数据之前,将每个分区上的输出与公共键结合起来。 > > 另一方面,当调用 groupByKey 时--所有键值对 都会被洗牌。这将导致大量不必要的数据 通过网络传输。

更多详细信息,请查看下面的链接

https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html

评论(2)
  • groupByKey()`只是根据键对数据集进行分组。当 RDD 尚未分区时,它会导致数据洗牌。
  • reduceByKey()类似于分组 + 聚合。我们可以说 reduceBykey() 相当于 dataset.group(...).reduce(...)。与groupByKey()` 不同的是,它会减少数据的洗牌。
  • aggregateByKey()` 逻辑上与 reduceByKey() 相同,但它允许以不同类型返回结果。例如,输入为 (1,2)、(1,4),输出为 (1,"six")。它还会在每个键的开头使用零值

注意 : 相同之处在于它们都是宽运算。

评论(0)

ReduceByKey reduceByKey(func, [numTasks])-

合并数据,使每个分区的每个键都至少有一个值。 然后进行洗牌,并通过网络发送到某个特定的执行器,以执行某些操作,如 reduce。

GroupByKey- groupByKey([numTasks])

它不会合并键值,而是直接进行洗牌处理 在这里,大量数据会被发送到每个分区,几乎与初始数据相同。

每个键值的合并是在洗牌后进行的。 在这里,大量数据存储在最终工作节点上,因此导致内存不足问题。

AggregateByKey - aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 它与 reduceByKey 类似,但可以在执行聚合时提供初始值。

使用 `reduceByKey

  • 当我们在大型数据集上运行时,可以使用 reduceByKey

  • 当输入和输出值类型相同时,使用 reduceByKey 超过aggregateByKey` 时

此外,建议不要使用 groupByKey 而使用 reduceByKey。详细信息请参阅 此处

您还可以参考 问题 以更详细地了解 reduceByKeyaggregateByKey 的用法。

评论(0)