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

 


1. 定义

复制代码
  /*
  * 1. 定义
  *    def foldByKey(zeroValue: V)(func: (V, V) => V): RDD[(K, V)]
  *    def foldByKey(zeroValue: V,partitioner: Partitioner)(func: (V, V) => V): RDD[(K, V)]
  *    def foldByKey(zeroValue: V, numPartitions: Int)(func: (V, V) => V): RDD[(K, V)]
  *
  * 2. 功能
  *    1. 分区内 根据相同的key,对value分组
  *        示例 :
  *           key,iter(value1,value2,value3)
  *    2. 根据传入的规则 reduce分区内的 相同key的 value
  *        示例 :
  *           func(zeroValue,value1)
  *    3. 聚合后输出每个分区的结果 key,value
  *
  *    4. 拉取每个分区 的key,value ,并对相同key 的value做reduce操作(存在Shuffle过程)
  *          示例 :  func(zeroValue,value1)...
  *
  *    5. 对 所有分区的key 做完reduce操作后,按照指定的 partitioner 重新对结果分区
  *          不指定分区器时,用默认分区器 HashPartitoner
  *          不指定分区个数时,用父Rdd分区个数
  *
  * 3. note
  *    1. zeroValue 会参与 分区内和分区间的 reduce操作
  *    2. foldByKey 等价于 aggregateByKey(分区内函数=分区间函数)
  *
  * */
复制代码

2. 示例

复制代码
  object aggregateTest 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.foldByKey("")(
      (zeroValue, value) => zeroValue + "-" + value
    )

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

    sc.stop()
  }
复制代码

 

posted @   学而不思则罔!  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示