欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spark——map和mapPartitions的区别

程序员文章站 2024-01-30 15:05:23
...
张三
李四
张三丰
李世民
张三

对名字做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)