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,只是前者类型为元组,后者的类型更加广泛
未完待续。。。。