一,Transformation变换/转换算子:
这种变换并不触发提交作业,这种算子是延迟执行的,也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行,需要等到有Action操作的时候才会真正触发。
1.Value数据类型的Transformation算子
这种变换并不触发提交作业,针对处理的数据项是Value型的数据
(1)输入分区与输出分区一对一型:
1.map算子
处理数据是一对一的关系,进入一条数据,出去的还是一条数据。map的输入变换函数应用于RDD中所有的元素,而mapPartitions应用于所有分区。区别于mapPartitions主要在于调度粒度不同。如parallelize(1
to 10 ,3),map函数执行了10次,而mapPartitions函数执行了3次。
2.flatMap算子
flatMap是一对多的关系,处理一条数据得到多条结果。将原来 RDD 中的每个元素通过函数 f 转换为新的元素,并将生成的 RDD
的每个集合中的元素合并为一个集合。
3.mapPartitions算子
mapPartitions遍历的是每一个分区中的数据,一个个分区的遍历。获 取 到 每 个 分 区 的 迭 代器,在 函 数 中 通 过 这
个 分 区 整 体 的 迭 代 器 对整 个 分 区 的 元 素 进 行 操 作,相对于map一条条处理数据,性能比较高,可获取返回值。可以通过函数f(iter)
=>iter.filter(_>=3)对分区中所有的数据进行过滤,大于和等于3的数据保留,一个方块代表一个RDD分区,含有1,2,3的分区过滤,只剩下元素3。
4.mapPartitionsWithIndex算子
拿到每个RDD中的分区,以及分区中的数据
(2)输入分区与输出分区多对一型
5.union算子
合并两个RDD,两个RDD必须是同种类型,不一定是K,V格式的RDD
6.cartesian算子
求笛卡尔积,该操作不会执行shuffle操作,但最好别用,容易触发OOM
(3)输入分区与输出分区多对多型
7.groupBy算子
按照指定的规则,将数据分组
groupByKey算子
有shuffle产生, 根据key去将相同的key对应的value合并在一起(K,V)=>(K,[V])
(4)输出分区是输入分区子集类型
8.filter算子
过滤数据,返回true的数据会被留下
9.distinct算子
distinct去重,有shuffle产生,内部实际是map+reduceByKey+map实现
10.subtract算子
取RDD的差集,subtract两个RDD的类型要一致,结果RDD的分区数与subtract算子前面的RDD分区数多的一致。
11.sample算子
sample随机抽样,参数sample(withReplacement:有无放回抽样,fraction:抽样的比例,seed:用于指定的随机数生成器的种子)
有种子和无种子的区别:
有种子是只要针对数据源一样,都是指定相同的参数,那么每次抽样到的数据都是一样的
没有种子是针对同一个数据源,每次抽样都是随机抽样
(5)Cache算子
13.cache算子
将结果缓存到内存中
14.persist算子
释放内存
cache()和persist()注意问题
- 1.cache()和persist()持久化单位是partition,cache()和persist()是懒执行算子,需要action算子触发执行
- 2.对一个RDD使用cache或者persist之后可以赋值给一个变量,下次直接使用这个变量就是使用持久化的数据。 * 也可以直接对RDD进行cache或者persist,不赋值给一个变量 *
- 3.如果采用第二种方法赋值给变量的话,后面不能紧跟action算子 * 4.cache()和persist()的数据在当前application执行完成之后会自动清除
2.Key-Value 数据类型的Transformation算子
这种变换并不触发提交作业,针对处理的数据项是Key-Value型的数据对
(1)输入分区与输出分区一对一
15.mapValues算子
针对K,V格式的数据,只对Value做操作,Key保持不变
flatMapValues
(K,V)->(K,V),作用在K,V格式的RDD上,对一个Key的一个Value返回多个Value
(2)对单个RDD或者两个RDD聚集
单个RDD聚集
16.combineByKey算子
首先给RDD中每个分区中的每一个key一个初始值
其次在RDD每个分区内部相同的key聚合一次
再次在RDD不同的分区之间将相同的key结果聚合一次
17.reduceByKey算子
首先会根据key去分组,然后在每一组中将value聚合,作用在KV格式的RDD上
18.repartition算子
重新分区,可以将RDD的分区增多或者减少,会产生shuffle,coalesc(num,true) = repartition(num)
两个RDD聚集
19.cogroup算子
合并两个RDD,生成一个新的RDD。分区数与分区数多个那个RDD保持一致
(3)连接
20.join算子
会产生shuffle,(K,V)格式的RDD和(K,V)格式的RDD按照相同的K,join得到(K,(V,W))格式的数据,分区数按照大的来。
21.leftOutJoin和rightOutJoin算子、fullOuterJoin算子
leftOuterJoin(K,V)格式的RDD和(K,V)格式的RDD,使用leftOuterJoin结合,以左边的RDD出现的key为主 ,得到(K,(V,Option(W)))
rightOuterJoin(K,V)格式的RDD和(K,W)格式的RDD使用rightOuterJoin结合以右边的RDD出现的key为主,得到(K,(Option(V),W))
fullOuterJoin算子(K,V)格式的RDD和(K,V)格式的RDD,使用fullOuterJoin结合是以两边的RDD出现的key为主,得到(K(Option(V),Option(W)))
intersection算子
取两个RDD的交集,两个RDD的类型要一致,结果RDD的分区数要与两个父RDD多的那个一致
二,.Action行动算子:
这类算子会触发SparkContext提交job作业,并将数据输出到Spark系统。
(1)无输出
22.foreach算子
遍历RDD中的每一个元素
(2)HDFS
23.saveAsTextFile算子
将DataSet中的元素以文本的形式写入本地文件系统或者HDFS中,Spark将会对每个元素调用toString方法,将数据元素转换成文本文件中的一行数据,若将文件保存在本地文件系统,那么只会保存在executor所在机器的本地目录
24.saveAsObjectFile算子
将数据集中元素以ObjectFile形式写入本地文件系统或者HDFS中
(3)Scala集合和数据类型
25.collect算子
collect回收算子,会将结果回收到Driver端,如果结果比较大,就不要回收,这样的话会造成Driver端的OOM
26.collectAsMap算子
将K、V格式的RDD回收到Driver端作为Map使用
27.count,countByKey,CountByValue算子
count统计RDD共有多少行数据
countByKey统计相同的key出现的个数
countByValue统计RDD中相同的Value出现的次数,不要求数据必须为RDD格式
28.take
take取出RDD中的前N个元素
takeSapmle(withReplacement,num,seed)
随机抽样将数据结果拿回Driver端使用,返回Array,
withReplacement:有无放回抽样,num:抽样的条数,seed:种子
29.reduce算子
30.aggregateByKey算子
首先是给定RDD的每一个分区一个初始值,然后RDD中每一个分区中按照相同的key,结合初始值去合并,最后RDD之间相同的key聚合
31.zipWithIndex算子文章来源:https://www.toymoban.com/news/detail-794812.html
将两个RDD合成一个K,V格式的RDD,分区数要相同,每个分区中的元素必须相同文章来源地址https://www.toymoban.com/news/detail-794812.html
到了这里,关于spark-常用算子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!