gpt4 book ai didi

apache-spark - Spark中reduceByKey、groupByKey、aggregateByKey、combineByKey之间的区别

转载 作者:行者123 更新时间:2023-12-03 05:56:32 29 4
gpt4 key购买 nike

谁能解释一下reducebykeygroupbykeyaggregatebykeycombinebykey之间的区别吗?我已阅读有关此内容的文档,但无法理解确切的差异。

带有示例的解释会很棒。

最佳答案

groupByKey:

语法:

sparkContext.textFile("hdfs://")
.flatMap(line => line.split(" ") )
.map(word => (word,1))
.groupByKey()
.map((x,y) => (x,sum(y)))

groupByKey 可能会导致磁盘不足问题,因为数据是通过网络发送并在减少的工作线程上收集的。

reduceByKey:

语法:

sparkContext.textFile("hdfs://")
.flatMap(line => line.split(" "))
.map(word => (word,1))
.reduceByKey((x,y)=> (x+y))

数据在每个分区进行组合,每个分区的一个 key 只有一个输出才能通过网络发送。 reduceByKey 需要将所有值组合成另一个具有完全相同类型的值。

aggregateByKey:

reduceByKey相同,它采用初始值。

3个参数作为输入

  1. 初始值
  2. 组合逻辑
  3. 序列操作逻辑

示例:

val keysWithValuesList = Array("foo=A", "foo=A", "foo=A", "foo=A", "foo=B", "bar=C", "bar=D", "bar=D")
val data = sc.parallelize(keysWithValuesList)
//Create key value pairs
val kv = data.map(_.split("=")).map(v => (v(0), v(1))).cache()
val initialCount = 0;
val addToCounts = (n: Int, v: String) => n + 1
val sumPartitionCounts = (p1: Int, p2: Int) => p1 + p2
val countByKey = kv.aggregateByKey(initialCount)(addToCounts, sumPartitionCounts)

输出:按键和结果聚合栏 -> 3foo -> 5

按键组合:

3个参数作为输入

  1. 初始值:与aggregateByKey不同,不需要总是传递常量,我们可以传递一个将返回新值的函数。
  2. 合并功能
  3. 组合功能

示例:

val result = rdd.combineByKey(
(v) => (v,1),
( (acc:(Int,Int),v) => acc._1 +v , acc._2 +1 ) ,
( acc1:(Int,Int),acc2:(Int,Int) => (acc1._1+acc2._1) , (acc1._2+acc2._2))
).map( { case (k,v) => (k,v._1/v._2.toDouble) })
result.collect.foreach(println)

reduceByKeyaggregateByKeycombineByKey 优先于 groupByKey

引用: Avoid groupByKey

关于apache-spark - Spark中reduceByKey、groupByKey、aggregateByKey、combineByKey之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364432/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com