张三
李四
张三丰
李世民
张三
对名字做wordcount
val spark: SparkSession = SparkSession.builder().master("local[2]").appName("mappartition").getOrCreate()
val sc: SparkContext = spark.sparkContext
import spark.implicits._
val rdd: RDD[String] = sc.textFile("src/data/1234")
//map写法 将值全部拿出来处理
rdd.map(x=>(x.charAt(0),1)).reduceByKey(_+_).foreach(println)
//mapPartitions写法 将每个分区内的值分别进行统计 内部先统计一次 然后最后在统计 减少了数据的shuffle的过程
rdd.mapPartitions(f=>{
val lst:ListBuffer[(Char,Int)] = ListBuffer[(Char,Int)]()
while(f.hasNext){
lst.append((f.next().charAt(0),1))
}
lst.groupBy(_._1).map(x=>(x._1,x._2.size)).toIterator
}).foreach(println)
//mapPartitions的另一种写法
rdd.mapPartitions(x=>x.map(x=>(x.charAt(0),1)).toArray.groupBy(_._1).map(x=>(x._1,x._2.size)).toIterator)
.reduceByKey(_+_).foreach(println)