给十种算子中最难看懂的的aggregate算子写法加上了注释(个人理解)
使用fold算子的代码逻辑与aggregate完全一致,只是分区内、分区间规则一致
看懂了aggregate就看懂了fold算子
希望给Spark初学者一点帮助
----*aggregate算子*----
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Wc")
val sc = new SparkContext(conf)
val word = sc.makeRDD(
List("Hive", "Hive", "Spark", "Scala")
)
//初始值传一个可变map
word.aggregate(mutable.Map[String, Int]()
)(
//初始值 和 第一个数据做计算
(map3, s) => {
// 给map3添加kv数据 value是通过getOrElse(s, 0) + 1得到
map3(s) = map3.getOrElse(s, 0) + 1
//getOrElse的意思是:如果get的S 拿到value了,证明map中有这个key,就在value+1
//如果没有拿到,就给value赋值0 ,然后再给value +1
map3
},
//分区间 对不同分区的map集合做操作, map1是集合,map2 是集合
(map1, map2) => {
//用foldLeft操作两个集合
map1.foldLeft(map2)(
//innerMap是一个map2中的每一个数据,kv是一个map1中的每一个数据
(innerMap, kv) => {
//给innerMap添加kv数据 value是通过getOrElse(s, 0) + 1得到
innerMap(kv._1) = innerMap.getOrElse(kv._1, 0) + kv._2
innerMap
}
)
}).foreach(println)
----*fold算子*----
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Wc")
val sc = new SparkContext(conf)
val word = sc.makeRDD(
List("Hive", "Hive", "Spark", "Scala")
)
word.map(s => mutable.Map(s -> 1)).fold(mutable.Map[String, Int]())(
(map1: mutable.Map[String, Int], map2: mutable.Map[String, Int]) => {
map1.foldLeft(map2)(
(innerMap, kv) => {
innerMap(kv._1) = innerMap.getOrElse(kv._1, 0) + kv._2
innerMap
}
)
}
).foreach(println)