对于一些没有用过的函数或者操作,看文字描述总是觉得很晦涩,很难理解,所以学习的时候我比较倾向于先从小例程入手,以便有直观的理解。关于这两个函数网上的介绍很多,但找了很久才找到我认为更方便理解的例程和描述,我把原文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分别针对每一个分区做求和操作
网友评论