RDD 中的 reducebyKey 与 groupByKey 哪个性能高?

groupByKey
val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum))
在这里插入图片描述
groupByKey的性能,相对来说,是有问题的
因为,它是不会进行本地聚合的,而是原封不动的,把ShuffleMapTask的输出,拉取到ResultTask的内存中,所以这样的话,会导致,所有的数据,都要进行网络传输,从而导致网络传输的性能开销很大
但是,有些场景下,用其他算法实现不了的,比如reduceByKey,sortByKey,countByKey实现不了的话,还是只能用groupByKey().map()来实现,比如可能你需要拿到某个key对应的所有的value,进行自定义的业务逻辑处理
reduceByKey
在这里插入图片描述
HashShuffleWriter的writer()方法,是先判断了一下,如果是isMapCombined,那么就在本地进行聚合,聚合之后,再写入磁盘文件
对于,仅仅是要对key对应的values进行聚合为一个值的场景,用reduceByKey是非常合适的,因为会先在ShuffleMapTask端写入本地磁盘文件的时候,进行本地聚合,再写入磁盘文件,此时,就会导致数据量大幅度缩减,甚至可能达到数据量缩减了几倍,甚至十几倍、几十倍的程度
这样的话,也就相当于,ShuffleMapTask端的数据,传输到ReduceTasl端的数据,数据量大幅度缩减,性能大幅度增加,甚至达到减少数据量的时间,几倍、十几倍、几十倍

如果能用reduceByKey,那就用reduceByKey,因为它会在map端,先进行本地combine,可以大大减少要传输到reduce端的数据量,减小网络传输的开销。
只有在reduceByKey处理不了时,才用groupByKey().map()来替代。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`reduceByKey` 和 `groupByKey` 都是 Spark 用于对 Pair RDD 进行聚合操作的函数,但它们的实现方式和结果不同。 `groupByKey` 会将具有相同 key 的所有 value 放在一起,然后对这些 value 进行操作。这意味着在进行聚合操作之前,所有具有相同 key 的 value 都会被传输到同一个节点上,这可能会导致网络传输和内存开销过大。因此,当数据量很大时,`groupByKey` 可能会导致性能问题。 相反,`reduceByKey` 将具有相同 key 的 value 放在一起,但在对这些 value 进行操作之前,它会先将它们通过用户自定义的聚合函数进行预处理,然后再进行操作。这样做可以减少传输的数据量和内存开销,因为只需要将每个 key 的聚合结果传输回原始节点。因此,在大规模数据集上使用 `reduceByKey` 可以获得更好的性能。 举个例子,假设有一个 Pair RDD 包含 (key, value) 对,其 key 是字符串,value 是整数。要计算每个 key 的平均值,可以使用以下代码: ```python # 使用 groupByKey rdd.groupByKey().mapValues(lambda x: sum(x) / len(x)) # 使用 reduceByKey rdd.mapValues(lambda x: (x, 1)).reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1])).mapValues(lambda x: x[0] / x[1]) ``` 在这个例子,`groupByKey` 将相同 key 的所有 value 放在一起,然后对每个 key 的所有 value 进行求和和计数,最后计算平均值。而 `reduceByKey` 先将每个 value 转换成一个元组 `(value, 1)`,然后对具有相同 key 的元组进行求和和计数。最后,再将总和除以计数得到平均值。显然,`reduceByKey` 比 `groupByKey` 效,因为它只需要传输每个 key 的总和和计数,而不是所有 value。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值