zoukankan      html  css  js  c++  java
  • Spark核心RDD:combineByKey函数详解

    https://blog.csdn.net/jiangpeng59/article/details/52538254

    为什么单独讲解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后,接下来就是对分区间进行合并了,分区间科目数和科目数相加分数和分数相加就得到了总分和总科目数
     
    执行结果如下:
    res1: Array[(String, Double)] = Array((Wilma,95.33333333333333), (Fred,91.33333333333333))
    
     

    例子来源:http://codingjunkie.net/spark-combine-by-key/
  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/9354878.html
Copyright © 2011-2022 走看看