dd的mapPartitions是map的一个变种,它们都可进行分区的并行处理。
两者的主要区别是调用的粒度不一样:map的输入变换函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区。
Map 算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。
假设一个rdd有10个元素,分成3个分区。如果使用map方法,map中的输入函数会被调用10次;而使用mapPartitions方法的话,其输入函数会只会被调用3次,每个分区调用1次。
从功能上讲:Map 算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。MapPartitions 算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据。
从性能上讲:Map 算子因为类似于串行操作,所以性能比较低,而是 mapPartitions 算子类似于批处理,所以性能较高。但是 mapPartitions算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。使用 map 操作。
例:可以求每个分区的最大值,亦或是在连接数据库操作时,可以以为分区单位进行操作
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("mapPartitions1") val sc = new SparkContext(conf) val file: RDD[Int] =sc.makeRDD(List(1,2,9,11,3,9,4,22,11),2) val result: RDD[Int] = file.mapPartitions(s => { Array(s.max).iterator }) result.foreach(println) sc.stop()
标签:map,mapPartitions,函数,val,分区,算子,mapPartition From: https://www.cnblogs.com/huifeidezhuzai/p/18021320