combineByKey的使用

说明

  • 对RDD中的数据进行初始化后进行分区内和分区间的合并。

函数签名

在这里插入图片描述

  • createCombiner:对数据进行初始化,并将数据作为参数,可以对数据进行转换操作,分区内每种key调用一次。
  • mergeValue:分区内合并,将key相同的元素V合并到刚刚经过转换的C上。
  • mergeCombiners:分区间合并,将key相同的两个C合为一个C。

执行过程

在这里插入图片描述

代码示例

	val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 88), ("b", 95), ("a", 91),
      ("b", 93), ("a", 95), ("b", 98)), 2)
    // 求均值
    val combineRDD: RDD[(String, (Int, Int))] = rdd.combineByKey(
      // 将value和1配对组成元组
      (_, 1),
      // 将其他的value和上面的元组合并
      // 必须显示声明C的类型,无法自动推断
      (tup1: (Int, Int), value) => {
    
    
        // 分数合并,总数+1
        (tup1._1 + value, tup1._2 + 1)
      },
      (tup2: (Int, Int), tup3: (Int, Int)) => {
    
    
        (tup2._1 + tup3._1, tup2._2 + tup3._2)
      }
    )
    val resRDD: RDD[(String, Int)] = combineRDD.map {
    
    
      case (key, datas) => {
    
    
        (key, datas._1 / datas._2)
      }
    }


    resRDD.collect().foreach(println)

    sc.stop()

猜你喜欢

转载自blog.csdn.net/FlatTiger/article/details/115054337