Spark RDD的高级算子

1mapPartitionsWithIndex: 对RDD中的每个分区进行操作,带有分区号
        定义:def mapPartitionsWithIndex[U](f: (Int, Iterator[T])=>Iterator[U], preservesPartitioning: Boolean = false)
                          (implicit arg0: ClassTag[U]): RDD[U] 
        参数说明:
        f: (Int, Iterator[T])=>Iterator[U]
        (*)Int: 分区号
        (*)Iterator[T]: 该分区中的每个元素
        (*)返回值:Iterator[U]

        Demo:
        (1)创建一个RDD:val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9),2)
        (2)创建一个函数,作为f的值
                def func1(index:Int,iter:Iterator[Int]):Iterator[String] ={
                   iter.toList.map(x=>"[PartID:" + index +",value="+x+"]").iterator
                }

        (3)调用
              rdd1.mapPartitionsWithIndex(func1).collect

        (4)结果:
        Array([PartID:0,value=1], [PartID:0,value=2], [PartID:0,value=3], [PartID:0,value=4], 
              [PartID:1,value=5], [PartID:1,value=6], [PartID:1,value=7], [PartID:1,value=8], [PartID:1,value=9])       


2、aggregate:聚合操作
        定义:def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U
        作用:先对局部进行操作,再对全局进行操作

        举例:
        val rdd1 = sc.parallelize(List(1,2,3,4,5),2)
        (1)求每个分区最大值的和
            先查看每个分区中的元素:
            rdd1..mapPartitionsWithIndex(func1).collect

            rdd1.aggregate(0)(math.max(_,_),_+_)

        (2)改一下:
                rdd1.aggregate(0)(_+_,_+_)              ====> 15
                rdd1.aggregate(10)(math.max(_,_),_+_)   ===>  30

aggregate聚合操作

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值