Spark RDD的transforms转换

7 篇文章 0 订阅
2 篇文章 0 订阅

在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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值