美文网首页
Spark学习(六):map & mapPartitions

Spark学习(六):map & mapPartitions

作者: CocoMama190227 | 来源:发表于2019-03-04 15:22 被阅读0次

    对于一些没有用过的函数或者操作,看文字描述总是觉得很晦涩,很难理解,所以学习的时候我比较倾向于先从小例程入手,以便有直观的理解。关于这两个函数网上的介绍很多,但找了很久才找到我认为更方便理解的例程和描述,我把原文1种的例程做了一点修改,并摘录了原文2的文字描述。

    map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应
    mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区,也就是把每个分区中的内容作为整体来处理的。

    代码如下:

    import org.apache.spark.{SparkConf, SparkContext}
    
    object mapAndMapPartitions {
      def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("mapAndMapPartitions").setMaster("local")
        var sc   = new SparkContext(conf)
    
        var aa   = sc.parallelize(1 to 7, 2) // RDD有两个分区
        aa.foreach(println) // output: 1 2 3 & 4 5 6 7 , 分别为两个区的元素
    
        println("1.map------------------------------------------")
        val aa_res  = aa.map( x => x + 1)
        println("Partitions' number: " + aa_res.getNumPartitions)  // 获取partitions数目, output: 2
        println("map: " + aa_res.collect().mkString(" "))
    
        println("2.mapPartitions--------------------------------")
        var cc_ref = aa.mapPartitions( x => {
          var result = List[Int]()
          var cur = 0
          while(x.hasNext){
            cur += x.next()
          }
          result.::(cur).iterator
        })
        println("mapPartitions: " + cc_ref.collect().mkString(" "))  
      }
    }
    

    输出结果:

    1
    2
    3
    4
    5
    6
    7
    1.map------------------------------------------
    map: 2 3 4 5 6 7 8
    2.mapPartitions--------------------------------
    mapPartitions: 6 22
    

    2.mapPartitions的结果分别为6和22,因为mapPartitions分别针对每一个分区做求和操作

    相关文章

      网友评论

          本文标题:Spark学习(六):map & mapPartitions

          本文链接:https://www.haomeiwen.com/subject/othiuqtx.html