在RDD中的转换都是延迟的,惰性的,意思是说,不会说执行到这行转换代码计算出结果,比如下面的、当我debug代码运行到rdd2的时候,不知道rdd2的值是什么,只知道类型
最开始只是记住这些转换的来源,即上一个动作,只有当发生一个要求返回结果给Driver时,这些转换才会被执行,这样让rdd更有效率,如上面,只有当执行rdd2.collect,这样要求返回结果到driver端时,rdd1.map才会被执行运算可以通过toDebugString来查看rdd的相关依赖即来源
scala> val rdd1=sc.makeRDD(1 to 10)
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:24
scala> val rdd2=rdd1.map(f=>f*f)
rdd2: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at <console>:26
scala> rdd2.toDebugString
res0: String =
(4) MapPartitionsRDD[1] at map at <console>:26 []
| ParallelCollectionRDD[0] at makeRDD at <console>:24 []
scala> val rdd3=rdd2.map(f=>(f,f-1))
rdd3: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[2] at map at <console>:28
scala> rdd3.toDebugString
res1: String =
(4) MapPartitionsRDD[2] at map at <console>:28 []
| MapPartitionsRDD[1] at map at <console>:26 []
| ParallelCollectionRDD[0] at makeRDD at <console>:24 []
rdd每的转换会在它执行一个动作时被重新计算,如执行rdd2.count和rdd2.collect两次动作都会重新进行rdd1.map运算,如果在很多次动作的情况,每一次都要重新执行一遍依赖是有可能会比较耗性能,这个时候可以使用persist(或者cache)方法,这个方法会在内存中持久化一个rdd,也可以在在磁盘上进行持久化数据集,这样下次访问rdd的时候就能更快速的访问而无需重复计算转换
scala> rdd2.cache
res6: rdd2.type = MapPartitionsRDD[6] at map at <console>:26
scala> rdd2.count
res7: Long = 10
scala> rdd2.collect
res8: Array[Int] = Array(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
RDD的转换有map、filter、mappartitons、flatmap、union、groupByKey、join等等
- map:最常见的操作即将rdd中每个数据想通过用户自定函数映射成新的元素,如rdd1:RDD[Int],rdd1.map(f=>(f,f*f))
- flatMap(func):类似于map,但每一个输入元素可以被映射成为一个或多个输出元素
- filter(func):返回一个经过过滤后的新数据集,过滤方式为func自定义的任意类型,对于每个项进行操作,返回true的数据项进行保留,新的数据集为上一个的子集
- mapPartitions:获取每个分区的迭代器,在函数中通过这个分区的整体迭代器对整个分区的元素进行操作
- union:合并两个相同类型的rdd,并且不进行去重操作,类似于sql的中union,由于没有union all操作,如果要去重的话可以使用rdd.distinct,rdd1++rdd2相当于union操作
- subtract:相当于两个rdd进行差集的操作,如rdd1.subtract(rdd2),相当于去除rdd1中所有不存在rdd2中的元素,有点类似not in操作
- groupByKey:对一个key/value的rdd进行分组操作,返回一个键值对的RDD[(K,Seq[V])],默认情况下只有8个并行的任务进行分组操作,可以通过传输来改变rdd.groupByKey(10)
- join:同类型相同的两个键值对RDD[K,V]进行相交操作,返回一个相同key对应所有元素在一起的键值RDD[(K,(V,U,W))],有点类似sql中join
- distinct:去重rdd中元素,返回一个不重复的rdd