(六)Spark源码理解之RDD----part3

3.1.9 cartesian

cartesian()函数返回RDD和其他RDD的笛卡尔乘机,生成新的RDD,即CartesianRDD

如:

val disData1=sc.parallelize(Array(1,2,3),2)

    val disData2=sc.parallelize(Array(2,3), 2)

val d=disData1.cartesian(disData2).collect

结果:d=Array((1,2),(1,3),(2,2),(2,3),(3,2),(3,3))

cartesian()函数生成的新的RDD的分区信息是结合了RDD和其他RDD的分区信息

3.1.10 groupBy

groupBy(f)函数将RDD中的元素按照f函数进行划分,生成的结果是一个新的RDD,但是RDD中的元素为一个key-value对,key值是f函数得到的相应结果,value是一个ArryBuffer,这个ArrayBuffer里的元素为RDD中调用f函数得到相同结果(key)的元素,这是一个shuffle操作

如:

val disData1=sc.parallelize(Array(1,2,3),2)

val d=disData1.groupBy(s=>s>2).collect

结果:d=Array((false,ArrayBuffer(1,2)),(true,ArrayBuffer(3)))

3.1.11 mapPartitions

mapPartitions()函数与map()函数类似,只不过前者是对分区进行操作,生成一个新的RDD,即MapPartitionsRDD,而后者是对RDD中的每个元素进行操作,mapPartitions一般也不会经常用到,用到最多的还是map()函数

如:因为这个用到少,所以就不特地去写代码解释了,借用下别人的代码

val a = sc.parallelize(1to 9, 3)

defmyfunc[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

}

val d=a.mapPartitions(myfunc).collect

结果:d=Array((2,3),(1,2), (5,6), (4,5),(8,9), (7,8))

foreachPartition()函数和mapPartitions()函数的意思类似,都是针对每个分区调用函数

这些函数的得到的新的RDD的分区信息和父RDD一致

3.1.12 mapWith

mapWith()函数与map()函数类似,不同的是mapWith()函数有两个输入函数,且第一个输入函数的参数是RDD元素对应的分区索引(索引从0开始),第二个输入函数的参数分别为:RDD的元素,第一个输入函数的结果,最终第二个输入函数的结果组成了新的RDD

如:

val disData1=sc.parallelize(Array(1,2,3),2)

 val d=disData1.mapWith((a=>a*2))((c,d)=>(d+2)).collect

                 

结果:d=Array(2,4,4)

flatMapWith()函数,foreachWith()函数,filterWith()函数和mapWith()函数一样,在此就不对flatMapWith()函数,foreachWith()函数,filterWith()函数一一进行解释了,参照mapWith()的理解即可

这些函数的得到的新的RDD的分区信息和父RDD一致

3.1.13 zip

zip()函数将RDD中的元素和其他RDD相应位置上的元素一一对应起来,组成一个key-value对,key值为RDD的元素,value为其他RDD的元素,最终结果为新的RDD,即ZippedRDD

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val disData2=sc.parallelize(Array(2,3,4,5), 2)

    val d=disData1.zip(disData2).collect

结果:d=Array((1,2),(2,3),(3,4),(4,5))

zip()函数生成的新的RDD的分区信息是结合了RDD和其他RDD的分区信息

与其类似的还有zipWithIndex(),zipWithUniqueId(),不同的是zipWithIndex()的key为RDD的各个元素,value为元素所处的分区的位置,或简而言之就是其在RDD中的位置,从0开始;zipWithUniqueId()的key为RDD的各个元素,value与其分区索引(从0开始),其在分区中的位置(从1开始),以及总的分区数相关,若分区为k,在分区中为第n个元素,有两个分区,则value值为(n-1)*2+k

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.zipWithUniqueId.collect

结果:d=Array((1,0),(2,2),(3,1),(4,3))

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.zipWithIndex.collect

结果:d=Array((1,0),(2,1),(3,2),(4,3))

3.1.14 subtract

subtract()函数从RDD中提取出不在其他RDD中的元素,生成一个新的RDD

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.subtract(disData2).collect

d.foreach(println)

结果:d=Array(1)

subtract()函数的得到的新的RDD的分区信息和父RDD一致

3.1.15 countByValue

countByValue()函数统计RDD中各个元素在RDD中出现的次数,返回的结果是一个map容器

如:

val disData1=sc.parallelize(Array(1,2,2,1,3,4),2)

val d=disData1.countByValue

结果:d=Map(2 -> 2, 4 -> 1, 1 -> 2, 3 ->1)

3.1.16 top & takeOrdered

top(n)和takeOrdered(n)函数从RDD中选取值最大或最小的n个元素,结果返回一个存放相应元素的数组,两个函数的作用相反

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.top(2)

结果:d=Array(4,3)

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.takeOrdered(2)

结果:d=Array(1,2)

3.1.17 keyBy

keyBy()函数使RDD中的各个元素调用同一函数,使得函数生成的结果与调用该函数的元素组成元组,最终生成新的RDD,RDD的类型就是各个元素所生成的元组

如:

val disData1=sc.parallelize(Array(1,2,3,4),2)

val d=disData1.keyBy(s=>s+2).collect

结果:d=Array((3,1),(4,2),(5,3),(6,4))

感觉keyBy()和map()函数有点类似,都是生成新类型的RDD,只是前者类型为元组,后者的类型更加广泛

未完待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值