Spark算子

Scala中创建RDD的方式

 1. 并行程序中的集合创建RDD ;

Spark算子_第1张图片

2.使用textFile方法,通过本地文件或HDFS创建RDD

1.Transformation算子: 

Transformations类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey等。Transformations算子是延迟执行,也叫懒加载执行。

1):filter 过滤数据,返回true的数据会被留下;

Spark算子_第2张图片

2):map 将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。特点:输入一条,输出一条数据。

3):flatmap 先map后flat。与map类似,每个输入项可以映射为0到多个输出项。特点:输入一条,输出多条数据;

Spark算子_第3张图片

4):mapPartitions mapPartitions 遍历的是每个分区中的数据,一个个分区的遍历,相对于map 一条条处理数据,性能比较高。

Spark算子_第4张图片

5):mapPartitionsWithIndex 想对于mapPartitions可以拿到RDD中的每个分区号,以及分区中的数据;

Spark算子_第5张图片

6):mapValues 作用于kv格式RDD,只能对v操作

Spark算子_第6张图片

7):flatMapValues 作用在K,V格式的RDD上,展开每一个key的value,返回多个k,v

Spark算子_第7张图片

8):groupBy 根据指定的规则分组

9):groupByKey 根据key 去将相同的key 对应的value合并在一起

10):sortBy 排序,参数中指定按照什么规则去排序,第二个参数 true/false 指定升序或者降序

11):sortByKey 默认按照key去排序,作用在K,V格式的RDD上

12):aggregateByKey 首先是给定RDD的每个分区一个初始值,RDD中每个分区内按照相同的key,结合初始值去合并,最后RDD之间相同的key 聚合。

Spark算子_第8张图片

13):reduceByKey 将相同的Key根据按照所给逻辑进行处理。


14):combinByKey 首先给RDD中每个分区中的每个key一个初始值,其次在RDD每个分区内部 相同的key聚合一次,再次在RDD不同的分区之间将相同的key结果聚合一次;

Spark算子_第9张图片

15):sample 参数sample(有无放回抽样,抽样的比例,种子),有种子和无种子的区别:有种子是只要针对数据源一样,都是指定相同的参数,那么每次抽样到的数据都是一样的;没有种子是针对同一个数据源,每次抽样都是随机抽样

16):intersection 取两个RDD的交集,两个RDD的类型要一致,结果RDD的分区数与父rdd多的一致;

Spark算子_第10张图片

17):substract 取RDD的差集subtract两个RDD的类型要一致,结果RDD的分区数与subtract算子前面的RDD的分区个数一致;

Spark算子_第11张图片

18):union 合并RDD ,两个RDD必须是同种类型,不必要是K,V格式的RDD 分区数等于两者之和;

Spark算子_第12张图片

19):zip 将两个RDD 对应分区内的数据合成一个K,V格式的RDD,分区数要相同,每个分区中的元素必须相同,分区数不变

Spark算子_第13张图片

20):zipWithIndex 将RDD和数据下标压缩成一个K,V格式的RDD

Spark算子_第14张图片

21):join (K,V)格式的RDD和(K,V)格式的RDD按照key相同join 得到(K,(V,W))格式的数据,join会产生shuffle

22):rightOuterJoin  (K,V)格式的RDD和(K,W)格式的RDD 使用rightOuterJoin结合是以右边的RDD出现的key为主,得到(K,(Option(V),W))

23):leftOuterJoin  (K,V)格式的RDD和(K,W)格式的RDD 使用leftOuterJoin结合是以左边的RDD出现的key为主,得到(K,(V,Option(W)))

24):distinct 去重,有shuffle产生,内部实际是 map+reduceByKey+map实现


2.Action算子

Action类算子也是一类算子(函数)叫做行动算子Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序中有几个Action类算子执行,就有几个job运行。

count 返回数据集中的元素数。会在结果计算完成后回收到Driver端。

take(n) 返回一个包含数据集前n个元素的集合。

first first=take(1),返回数据集中的第一个元素。

foreach 循环遍历数据集中的每个元素,运行相应的逻辑。

collect 将计算结果回收到Driver端。

3.控制算子

控制算子有三种,cache,persist,checkpoint,以上算子都可以将RDD持久化,持久化的单位是partition。cache和persist都是懒执行的。必须有一个action类算子触发执行。checkpoint算子不仅能将RDD持久化到磁盘,还能切断RDD之间的依赖关系。

1) cache

默认将RDD的数据持久化到内存中。cache是懒执行。从代码中可以看出cache和MEMORY级别的persist()一样

2) persist:

可以指定持久化的级别。最常用的是MEMORY_ONLY和MEMORY_AND_DISK。”_2”表示有副本数。

Spark算子_第15张图片
persist持久话存储级

3)  cache和persist的注意事项:

1. cache和persist都是懒执行,必须有一个action类算子触发执行。

2. cache和persist算子的返回值可以赋值给一个变量,在其他job中直接使用这个变量就是使用持久化的数据了。持久化的单位是partition。

3. cache和persist算子后不能立即紧跟action算子。

4. cache和persist算子持久化的数据当applilcation执行完成之后会被清除。

4) checkpoint

checkpoint将RDD持久化到磁盘,还可以切断RDD之间的依赖关系。checkpoint目录数据当application执行完之后不会被清除。

5) checkpoint 的执行原理:

1. 当RDD的job执行完毕后,会从finalRDD从后往前回溯。

2. 当回溯到某一个RDD调用了checkpoint方法,会对当前的RDD做一个标记。

3. Spark框架会自动启动一个新的job,重新计算这个RDD的数据,将数据持久化到HDFS上。

6) 优化:对RDD执行checkpoint之前,最好对这个RDD先执行cache,这样新启动的job只需要将内存中的数据拷贝到HDFS上就可以,省去了重新计算这一步。

你可能感兴趣的:(Spark算子)