- 定义一个RDD,里面是元祖,key是姓名 value是分数,此RDD有三个分区如下
val input = sc.parallelize(Array((Fred,88), (Fred,95), (Fred,91), (Wilma,93), (Wilma,95), (Wilma,98)))
scala> input.mapPartitionsWithIndex((index,iter)=>Iterator(index+":"+ iter.mkString("-"))).collect
res3: Array[String] = Array(0:(Fred,88)-(Fred,95), 1:(Fred,91)-(Wilma,93), 2:(Wilma,95)-(Wilma,98))
- 使用combineByKey
val combine = input.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))
解释如下
combineBykey的算子定义如下
def combineByKey[C](createCombiner: Int => C,mergeValue: (C, Int) => C,mergeCombiners: (C, C) => C): org.apache.spark.rdd.RDD[(String, C)]
算子包含三个方法
方法一:createCombiner:在每个分区遍历元素,没遇到过的,第一次出现的,使用此方法这里是(v)=>(v,1),,不是初次出现,忽略
方法二:方法一完成后,再处理不是第一次出

本文通过实例讲解如何使用Spark的combineByKey算子来计算姓名对应的分数平均值。首先定义了一个包含姓名和分数的RDD,并详细阐述了combineByKey的三个关键方法:createCombiner、mergeValue和mergeCombiners的执行过程。在分区内部,createCombiner处理首次出现的数据,mergeValue处理后续数据;而在分区间,通过mergeCombiners进行数据合并。理解这些要点是掌握combineByKey的关键。
最低0.47元/天 解锁文章
987





