spark中RDD计算是以分区为单位的,而且计算函数都是在对迭代器复合,不需要保存每次计算的结果。mapPartitions的输入函数是应用于每个分区,也就是把每个分区的内容作为整体来处理的:
def mapPartitions[U:ClassTag](f:Iterator[T]=>Iterator[U], preservesPartitioning:Boolean=false):RDD[U]
f即输入函数,它处理每个分区里面的内容。每个分区的内容将以Iterator[T]传递给输入函数f,f的输出结果是Iterator[U]。最终的RDD由所有分区经过输入函数处理后的结果合并起来的。在下面的例子中,函数iterfunc是把分区中的一个元素和它的下一个元素组成一个Tuple。
scala> val a=sc.parallelize(1 to 9,3)
a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
scala> def iterfunc [T](iter:Iterator[T]):Iterator[(T,T)]={
| var res=List[(T,T)]()
| var pre=iter.next
| while(iter.hasNext){
| val cur=iter.next
| res::=(pre,cur)
| pre=cur}
| res.iterator}
iterfunc: [T](iter: Iterator[T])Iterator[(T, T)]
scala> a.mapPartitions(iterfunc)
res0: org.apache.spark.rdd.RDD[