第五章_Spark核心编程_Rdd_转换算子_keyValue型_reduceByKey
1. 定义
/* * 1. 定义 * def reduceByKey(func: (V, V) => V): RDD[(K, V)] * def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)] * def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)] * * 2. 功能 * 按照相同的 Key 对 Value 进行聚合 * 传输的函数为聚合规则(相对于MapReduce中的reduce函数) * * 3. note * 1. 发送到reduce端聚合时,会在Map端预聚合(自动触发) * 2. 只能操作 key-value类型的Rdd * 3. 不指定分区器时,使用默认分区器和分区个数和父Rdd相同 * 4. scala语言中一般的聚合操作都是两两聚合,spark基于scala开发的,所以它的聚合也是两两聚合 * 5. 当key 只要一个元素时,参数函数时不会参与运算的
* 6. 指定的分区器和分区个数,是对聚合结果的处理 * * */
2. 示例
object RddTransitionOperator_reduceByKey extends App { private val sc: SparkContext = CommonUtils.getSparkContext("zip operator") private val rdd: RDD[(String, Int)] = sc.parallelize(List(("word", 1), ("word", 2), ("豆", 3), ("豆", 4)), 1) // 使用默认分区器 + 分区个数等于父rdd分区个数 private val rdd3: RDD[(String, Int)] = rdd.reduceByKey((v1, v2) => v1 + v2) println(s"分区个数:${rdd3.getNumPartitions}") println(s"类名:${rdd3.getClass.getName}") println(s"依赖类型:${rdd3.dependencies}") // 分区个数:1 // 类名:org.apache.spark.rdd.ShuffledRDD // 依赖类型:List(org.apache.spark.ShuffleDependency@acdcf71) println(rdd3.collect.mkString(",")) //1,2,3,3,7 // 使用默认分区器 + 指定rdd分区个数 private val rdd4: RDD[(String, Int)] = rdd.reduceByKey((v1, v2) => v1 + v2, 3) println(s"分区个数:${rdd4.getNumPartitions}") println(s"类名:${rdd4.getClass.getName}") println(s"依赖类型:${rdd4.dependencies}") // 分区个数:3 // 类名:org.apache.spark.rdd.ShuffledRDD // 依赖类型:List(org.apache.spark.ShuffleDependency@6631cb64) // 使用指定分区器 private val rdd5: RDD[(String, Int)] = rdd.reduceByKey(new HashPartitioner(2), (v1, v2) => v1 + v2) println(s"分区个数:${rdd5.getNumPartitions}") println(s"类名:${rdd5.getClass.getName}") println(s"依赖类型:${rdd5.dependencies}") //sc.stop() //while (true) {} }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界