编程语言
首页 > 编程语言> > 第五章_Spark核心编程_Rdd_转换算子_keyValue型_combineByKey

第五章_Spark核心编程_Rdd_转换算子_keyValue型_combineByKey

作者:互联网

1. 定义

  /*
  * 1. 定义
  *   def combineByKey[C](createCombiner: V => C,
  *                       mergeValue: (C, V) => C,
  *                       mergeCombiners: (C, C) => C,
  *                       numPartitions: Int): RDD[(K, C)]
  *
  *   def combineByKey[C](createCombiner: V => C,
  *                       mergeValue: (C, V) => C,
  *                       mergeCombiners: (C, C) => C,
  *                       partitioner: Partitioner,
  *                       serializer: Serializer = null): RDD[(K, C)]
  *
  *   def combineByKey[C](createCombiner: V => C,
  *                       mergeValue: (C, V) => C,
  *                       mergeCombiners: (C, C) => C): RDD[(K, C)]
  *
  *   createCombiner : 将相同key的第一个value,进行数据类型转换
  *   mergeValue : 分区内 相同key 聚合规则
  *   mergeCombiners : 分区间 相同key 聚合规则
  *
  * 2. 功能
  *     1. 对 key-value型rdd 按相同的key 对value进行聚合
  *     2. 可以将 Rdd[(K,V)]  转换为 Rdd[(K,C)]
  *
  * 3. 操作流程
  *     1. 分区内 对相同的key 进行分组
  *         key iter(value1,value2,value3)
  *
  *     2. 分区内 对相同key 的value进行聚合
  *         1. 将 value1 转换为 createCombiner(value1)=数据类型C
  *         2. 按照指定的规则对 value进行聚合
  *            mergeValue(createCombiner(value1),value2) => 数据类型C
  *            note : createCombiner(value1),value2类型可能不一致
  *         3. 合并完结果为
  *            key,数据类型C
  *
  *     3. 分区间 对相同key 的value进行聚合
  *         1.按照指定的规则对 value进行聚合
  *            mergeCombiners: (数据类型C, 数据类型C) => 数据类型C
  *
  * */

2. 示例

  object combineByKeyPakTest extends App {

    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    val rdd: RDD[(Int, String)] = sc.makeRDD(List((2, "x1"), (2, "x2"), (2, "x3"), (4, "x4"), (5, "x5"), (5, "x6"), (6, "x7")), 2)

    private val rdd2 = rdd.combineByKey(
      //转换 value类型为List
      (tp) => {
        println(s"转换:${tp}")
        List[String](tp)
      },
      (list: List[String], value1: String) => {
        list :+ value1
      }
      , (list1: List[String], list2: List[String]) => {
        list1.union(list2)
      }


    )

    println(s"${rdd2.collect().mkString(",")}")

    sc.stop()
  }

 

标签:combineByKey,value1,createCombiner,数据类型,value,Rdd,keyValue,key,List
来源: https://www.cnblogs.com/bajiaotai/p/16056426.html