RDD的分区计算-mapPartitions

Spark的RDD计算基于分区,mapPartitions函数允许将每个分区作为一个整体处理。输入函数f接受Iterator[T],返回Iterator[U],生成的新RDD由所有分区处理后的结果合并。在示例中,iterfunc函数组合每个元素与其后续元素形成Tuple,但最后一个元素由于没有后续元素,不参与组合。使用collect()和glom()可将RDD转换为数组。
摘要由CSDN通过智能技术生成

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[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值