spark 学习记录 -- Spark中foreachPartition和partitions.foreach的区别

foreachPartition 属于action运算操作,而mapPartitions是在Transformation中,所以是转化操作,此外在应用场景上区别是mapPartitions可以获取返回值,继续在返回RDD上做其他的操作,而foreachPartition因为没有返回值并且是action操作,所以使用它一般都是在程序末尾比如说要落地数据到存储系统中如mysql,es,或者hbase中,可以用它。

一个foreachPartition例子:

    val sparkConf=new SparkConf()
    val sc=new SparkContext(sparkConf)
    sparkConf.setAppName("spark demo example ")
    val rdd=sc.parallelize(Seq(1,2,3,4,5),3)
    
    rdd.foreachPartition(partiton=>{
      // partiton.size 不能执行这个方法,否则下面的foreach方法里面会没有数据,
      //因为iterator只能被执行一次
      partiton.foreach(line=>{
        //save(line)  落地数据
      })

    })
    
    sc.stop()

一个mapPartitions例子:

    val sparkConf=new SparkConf()
    val sc=new SparkContext(sparkConf)
    sparkConf.setAppName("spark demo example ")
    val rdd=sc.parallelize(Seq(1,2,3,4,5),3)

    rdd.mapPartitions(partiton=>{
      //只能用map,不能用foreach,因为foreach没有返回值
      partiton.map(line=>{
        //save line
      }
      )
    })

    rdd.count()//需要action,来触发执行
    sc.stop()
RDD.partitions.foreach { each =>
  println(each)
  println("\t" + each.index)
  println("\t" + each.hashCode())
}

你可能感兴趣的:(spark)