总结常用的Transformation算子和Action算子,及基本用法

只有是Action时,才会执行立即操作。 Transformation是 lazy的操作,不会立即执行,执行Transformation的算子时,会返回一个新的RDD,依赖上一个RDD

transformation:
1、sortBy :  对于RDD的是非元组型,rdd1.soreBy(x=>x),元组型按value排序
rdd.soreBy(_._2)(进行shuffle)

2、sortByKey : 对于RDD内存的是元组类型的使用(进行shuffle) ,sortBy和
sortByKey都是transformation算子,但都会触发job任务,底层new了一个rangePartition对象,底层会调用一个foreach方法,进行排序,所以会触发job

3、reduceByKey(_+_) : 先在分区内进行按key合并,在全局合并(全局是把相同key的
不同的分区,拉倒同一个分区(有多个分区))会进行shuffle

4、filter: 过滤, 不会进行shuffle

5、flatMap: 方法,可以先切分,再压平, 不会进行shuffle

6、 rdd1.intersection(rdd2), 求两个集合的交集

7.0、 rdd1.union(rdd2),返回rdd1和rdd2中的所有元素,返回类型是Array,不Shuffle

7、rdd1.join(rdd2), 返回结果RDD[(String, (Int, Int))],join是内连接,
只有相同的才会join,会有shuffle过程

8、 rdd1.leftOuterJoin(rdd2),返回结果是RDD[(String, (Int, Option[Int]))],如果有rdd2中有和rdd1对应的数据时Some(value值),没有值None,第一个Int是rdd1中的value,rdd1中的数据会显示完,有shuffle

9、rdd1.rightOuterJoin(rdd2),返回结果是RDD[(String, (Option[Int], Int))],
String是key类型, Option[Int]表示和rdd2中对应的没有,就和None,
 有和rdd2中的数据对应的就是Some(value),rdd2中的数据会显示完,有shuffle
 
10、rdd.groupByKey(), 按key进行聚合,把不同分区的相同的key拉倒同一台机器上,返回值是 RDD[(String, Iterable[Int])],String 是key的类型,迭代器是相同key的value的,如果想要聚合  ,可以调用 map(x=>(x._1,x._2.sum))方法,相当于reduceBykey.会进行shuffle,
10.1 rdd.groupBy() 通过指定的值进行聚合,返回的值是
 RDD[(String, Iterable[(String, Int)])] ,迭代器中的类型是整个KV的类型
 
11、rdd.reduceByKey(_+_),返回值RDD[(String, Int)],在分区内按key进行聚合
(Combiner),再把不同分区的相同的key的数据拉倒同一机器上进行聚合,会进行shuffle,
reduceByKey会进行Combiner,所以比groupByKey效率高,一般用reduceByKey

12、rdd1.cogroup(rdd2) 会有shuffle,把相同的key聚合在同一机器会出现shuffle,返
回是 RDD[(String, (Iterable[Int], Iterable[Int]))],有点类似以全外连接,所
有的rdd1和rdd2中的所有数据都能显示,String是key,第一个迭代器是对应rdd1中key的所有
value,第二个迭代器是对应rdd2中对应key的所有value,会出现如下这种结果
(jack,(CompactBuffer(3),CompactBuffer()))
(jerry,(CompactBuffer(),CompactBuffer(2,6)))

13、fm.mapPartitions(it=>it.map(_*2)),传的参数是一个函数,函数的参数是迭代器,
返回是迭代器, 参数是每个分区中的数据是一个迭代器, 整个方法的返回值是 RDD[String],
跟map类似,但map是把数据一条一条的处理,mapPartitions 是把数据一个分区一个
分区的处理,把数据放到内存。在数据量小时,推荐使用mapPartitions,在数据量大时
可能会出现内存溢出oom

14、rdd.distinct()会发生shuffle,去重,返回类型RDD[Int]与rdd有关。
distinct底层调用的是ReduceByKey


15、rdd.coalesce(2,flag:Boolan), 设置分区数,有两个参数,第一个是表示设置的分
区个数,第二是默认是false,表示不进行shuffle,返回值是RDD[(String,Int)],调用的
rdd的类型一样。在不进行shuffle时,设置分区只能设置的小,不能设置大。把分区设置小
时会把 其中的某一个分区一下全分给另一个分区,比如一共有3分区,现在设置成2个,
会把其中的一个第3个分区中的数据全部给另2,而不是把第3个分区中的数据分散到分区1、2
上,不会发生shuffle。把分区设大时,一定会发生shuffle,会把其中分区中的部分数据拿
出来给新的分区,一定会出现shuffle。所以分区数默认是只能设小,不能变大,如果设的大
了,还是按原来的分区 。想要变大,可以把参数设置成true,进行shuffle,默认是不
进行shuffle

16、rdd.rePartitions(分区数,Boolean) 方法可以调整分区数,默认会发生shuffle,
底层相当于调用了rdd.coalesce(true)方法,会发生Shuffle,
一般情况下,都需要把分区个数调大,会发生shuffle,把分区中的部分数据分给其他的新的
分区,所以会发生shuffle



17、val mpwi:[String] = rdd2.mapPartitionsWithIndex((index: Int, it: Iterator[(String, Int)]) => {it.map(e => s"Part : $index, ele : $e")
}) 
 获取数据和分区号,index是分区号,it:Iterator 是一个分区的数据,该方法参数是一个
 函数,该方法的返回值是与iterator中的map方法一样
还可以使用:,把partFunction当做参数传到mapPartitions方法中





Action:
1、collect 无shuffle:返回的是Array类型,打印的话需要toBuffer
2、sum 无shuffle:返回值是double类型
3、reduce(_+_)  :可以用于替换sum, 返回值与调用的值有关
4、rdd.countByKey()有shuffle,计算相同的key出现的次数,与value无关,返回值是collection.Map[String, Long], String是指的是Key,Long指的是相同key出现的次数。底层实现是reduceByKey,
def countByKey(): Map[K, Long] = self.withScope {
  self.mapValues(_ => 1L).reduceByKey(_ + _).collect().toMap
},把value都换成1,在求相同key 的和
5、count ,计数
6、take,可以用于求topN, 获取指定的几条数据
7、foreach
8、saveAsTextFile
9、foreachPartition





















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值