combineByKey
聚合函数一般在集中式数据比较方便,如果涉及到分布式的数据集,该如何去实现呢;这里介绍一下combineByKey,这个是各种聚集操作的鼻祖
简要介绍
def combineByKey[C] (createCombiner: (V) => C,
mergeValue: (C,V) => C,
mergeCombiners: (C,C) => C): RD
cerateCombiner:combineByKey()会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。如果这是一个新的元素,combineByKey()会使用一个叫做createCombiner()的函数来创造那个键对应的累加器的初始值
mergeValue:如果这是一个在处理当前分区之前已经遇到的键,他会使用mergeValue()方法将该键的累加器对应的当前值与这个新的值进行合并
mergeCombiners:由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,就需要使用用户提供的mergeCombiners()方法将各个分区的结果进行合并。
计算学生平均成绩例子:
创建一个学生成绩说明的类
scala版本:
case class ScoreDetail(studentName: String, subject: Dtring, score: Float)
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("combinebykey")
val sc = SparkContext.getOrCreate(conf)
val scores = List(
ScoreDetail("Aythna","Music",96),
ScoreDetail("Aythna","Math",92),
ScoreDetail("Tomoyo","English",97),
ScoreDetail("Tomoyo","Science",90),
ScoreDetail("LiSA","Sports",94),
ScoreDetail("LiSA","Music",99),
ScoreDetail("Ninja","Music",92),
ScoreDetail("Ninja","Sports",96),
ScoreDetail("Sino","Music",95),
ScoreDetail