spark 的transformations之map,flatMap,mapPartitions,mapPartitionsWithIndex的用法

        版本spark1.6.1

      spark的编程思想跟mapreduce有很大的相似之处,这几个函数都可以看做是类似在map端的操作处理。

      一个RDD(分布式弹性数据集),包含n个partition,你可以将每个partition看做是类似map的操作。

  

Transformation	Meaning
map(func) 	Return a new distributed dataset formed by passing each element of the source through a function func.
flatMap(func) 	Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).
mapPartitions(func) 	Similar to map, but runs separately on each partition (block) of the RDD, so func must be of type Iterator<T> => Iterator<U> when running on an RDD of type T.
mapPartitionsWithIndex(func) 	Similar to mapPartitions, but also provides func with an integer value representing the index of the partition, so func must be of type (Int, Iterator<T>) => Iterator<U> when running on an RDD of type T. 
    这几个transformations的主要区别:

    map和flatMap的func接受的都是一个item参数,map返回也是一个item,flatMap返回是一个Seq 

    mapPartitions的func函数接收的是一个迭代器,返回也是一个迭代器

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import scala.collection.mutable.ArrayBuffer

object Test2 {
     def main(args:Array[String]){
      val sparkconf = new SparkConf().setAppName("test2").setMaster("local")
      val sc = new SparkContext(sparkconf)
      
      val list = List(1,2,3,4,5,6,7,8,9,0)
      val rdd = sc.parallelize(list, 3);
    
      //   map    :   transformations
      //   map(func) 	Return a new distributed dataset formed by passing each element of 
      //    the source through a function func.
      //map的作用是将  T =》U
      val rddmap  = rdd.map(_+10)
      rddmap.foreach ( println )     
      
      //    flatMap   :    Transformations
      //    flatMap(func) 	Similar to map, but each input item can be mapped to 0 or more output items 
      //(so func should return a Seq rather than a single item).
      //flatMap    T=>Seq(u)
      //flatMap与map的区别在于,flatMap对于每一条item,会输出一个Seq,而map只是一个另一个item
      val rddflatmap = rdd.flatMap ( x => for(y<-1 to x) yield y )  
      println("count="+rddflatmap.count())
      rddflatmap.foreach ( x=>println("rddflatmap="+x) )
      
      //mapPartitions  : Transformations
      //mapPartitions(func) 	Similar to map, but runs separately on each partition (block) of the RDD, 
      //so func must be of type Iterator<T> => Iterator<U> when running on an RDD of type T. 
      //mapPartitions的func接收的参数是一个迭代器(iter),然后输出的是另一个迭代器(iter)。作用于该RDD中的每一个partition
      val rddmappartitions = rdd.mapPartitions(iter => { val s= new ArrayBuffer[Int](); while(iter.hasNext) {val m=iter.next(); for(i<-(1 to m)) s+=i } ;   s.iterator}, false)
      rddmappartitions.foreach ( println )
      //mapPartitionsWithIndex  : Transformations
      //mapPartitionsWithIndex(func) 	Similar to mapPartitions, but also provides func with an integer value 
      //representing the index of the partition, so func must be of type (Int, Iterator<T>) => Iterator<U> 
      //when running on an RDD of type T. 
      //mapPartitionsWithIndex相比mapPartitions,只是增加了一个partition id。
      val mapPartitionsWithIndex = rdd.mapPartitionsWithIndex((x,y)=>{println("partition id is "+x);if(x==0){for(t<-y) yield t+10};else for(t<-y) yield 0; }, false);
      mapPartitionsWithIndex.foreach(println)
  
      
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值