Spark RDD的转换

来源:互联网 发布:怪物猎人捏脸数据女库 编辑:程序博客网 时间:2024/05/19 15:23

在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>:24scala> val rdd2=rdd1.map(f=>f*f)rdd2: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at <console>:26scala> rdd2.toDebugStringres0: 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>:28scala> rdd3.toDebugStringres1: 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.cacheres6: rdd2.type = MapPartitionsRDD[6] at map at <console>:26scala> rdd2.countres7: Long = 10scala> rdd2.collectres8: 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
原创粉丝点击