zoukankan      html  css  js  c++  java
  • Spark RDD——combineByKey

    为什么单独讲解combineByKey?

    因为combineByKey是Spark中一个比较核心的高级函数,其他一些高阶键值对函数底层都是用它实现的。诸如 groupByKey,reduceByKey等等

    如下给出combineByKey的定义,其他的细节暂时忽略(1.6.0版的函数名更新为combineByKeyWithClassTag)

    1. def combineByKey[C](  
    2.       createCombiner: V => C,  
    3.       mergeValue: (C, V) => C,  
    4.       mergeCombiners: (C, C) => C,  
    5.       partitioner: Partitioner,  
    6.       mapSideCombine: Boolean = true,  
    7.       serializer: Serializer = null)  

    如下解释下3个重要的函数参数:

    • createCombiner: V => C ,这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)
    • mergeValue: (C, V) => C,该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)
    • mergeCombiners: (C, C) => C,该函数把2个元素C合并 (这个操作在不同分区间进行)
     
    如下看一个使用combineByKey来求解平均数的例子
     
    1. val initialScores = Array(("Fred", 88.0), ("Fred", 95.0), ("Fred", 91.0), ("Wilma", 93.0), ("Wilma", 95.0), ("Wilma", 98.0))  
    2. val d1 = sc.parallelize(initialScores)  
    3. type MVType = (Int, Double) //定义一个元组类型(科目计数器,分数)  
    4. d1.combineByKey(  
    5.   score => (1, score),  
    6.   (c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),  
    7.   (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2)  
    8. ).map { case (name, (num, socre)) => (name, socre / num) }.collect  
    参数含义的解释
    a 、score => (1, score),我们把分数作为参数,并返回了附加的元组类型。 以"Fred"为列,当前其分数为88.0 =>(1,88.0)  1表示当前科目的计数器,此时只有一个科目

    b、(c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),注意这里的c1就是createCombiner初始化得到的(1,88.0)。在一个分区内,我们又碰到了"Fred"的一个新的分数91.0。当然我们要把之前的科目分数和当前的分数加起来即c1._2 + newScore,然后把科目计算器加1即c1._1 + 1

    c、 (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2),注意"Fred"可能是个学霸,他选修的科目可能过多而分散在不同的分区中。所有的分区都进行mergeValue后,接下来就是对分区间进行合并了,分区间科目数和科目数相加分数和分数相加就得到了总分和总科目数
     
    执行结果如下:
    [plain] view plain copy
     
    1. res1: Array[(String, Double)] = Array((Wilma,95.33333333333333), (Fred,91.33333333333333))  
     

    例子来源:http://codingjunkie.net/spark-combine-by-key/
  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/itdyb/p/8242772.html
Copyright © 2011-2022 走看看