aggregateByKey的使用及案例

首先byKey的所有算子都是执行在kv类型的RDD上的~~~

aggregateByKey算子的定义如下,此算子中有俩个方法seqOp combOp
seqOp函数用于在每一个分区中用初始值(zeroValue)逐步迭代value,combOp函数用于合并每个分区中的结果

注意这俩个参数方法都是bykey计算的

aggregateByKey(zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)

例子

scala> val rdd = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),3)
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[12] at parallelize at <console>:24

scala> val agg = rdd.aggregateByKey(0)(math.max(_,_),_+_)
agg: org.apache.spark.rdd.RDD[(Int, Int)] = ShuffledRDD[13] at aggregateByKey at <console>:26

scala> agg.collect()
res7: Array[(Int, Int)] = Array((3,8), (1,7), (2,3))

scala> agg.partitions.size
res8: Int = 3

scala> val rdd = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),1)
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[10] at parallelize at <console>:24
scala> val rdd = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),3)
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[12] at parallelize at <console>:24

scala> val agg = rdd.aggregateByKey(0)(math.max(_,_),_+_)
agg: org.apache.spark.rdd.RDD[(Int, Int)] = ShuffledRDD[13] at aggregateByKey at <console>:26

scala> agg.collect()
res7: Array[(Int, Int)] = Array((3,8), (1,7), (2,3))

scala> agg.partitions.size
res8: Int = 3

scala> val rdd = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),1)
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[10] at parallelize at <console>:24

scala> val agg = rdd.aggregateByKey(0)(math.max(_,_),_+_).collect()
agg: Array[(Int, Int)] = Array((1,4), (3,8), (2,3))

例子的图解
在这里插入图片描述foldByKey 就是aggregateByKey的简化操作,seqop和combop相同
foldBykey(0)(+):即seqop,combop都是_+_操作
aggregateByKey & foldByKey 都是先对分区内进行操作,再对不同分区间进行操作

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍一下aggregateByKey案例。 在Spark中,aggregateByKey是一种常用的转换操作,它可以对RDD中的每个key对应的value进行聚合操作,同时也可以对每个key进行不同的聚合操作。下面是一个简单的案例,以展示如何使用aggregateByKey来计算每个key对应的平均值。 假设我们有一个包含以下内容的RDD: ``` (1,2) (1,4) (2,1) (2,3) (2,5) ``` 我们想要计算每个key对应的平均值,我们可以使用aggregateByKey来实现。具体步骤如下: 1. 初始化每个key对应的累加器和计数器为0:`(0,0)` 2. 对于每个value,将其加入到key对应的累加器中,同时将计数器加1 3. 对于每个key,在所有的value都被累加后,计算key对应的平均值:`sum/count` 4. 返回每个key对应的平均值作为结果 下面是使用Spark的Scala API实现该逻辑的代码: ```scala val rdd = sc.parallelize(Seq((1,2), (1,4), (2,1), (2,3), (2,5))) val avgByKey = rdd.aggregateByKey((0,0))( (acc, value) => (acc._1 + value, acc._2 + 1), (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2) ).mapValues { case (sum, count) => sum.toDouble / count } avgByKey.foreach(println) ``` 输出结果如下: ``` (1,3.0) (2,3.0) ``` 这个例子中,我们首先创建一个包含5个元素的RDD,然后使用aggregateByKey进行聚合操作。在聚合时,我们使用一个二元组`(0,0)`作为累加器的初始值。接着,我们使用一个函数将每个value加入到累加器中,并将计数器加1。最后,我们使用另一个函数将所有的累加器进行合并,并计算每个key对应的平均值。最后,我们使用mapValues函数将结果转换为平均值,并输出结果。 希望这个例子能够帮助您更好地理解aggregateByKey使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值