Spark的Transform算子和Action算子列举和示例
一:Spark的算子的分类
1. 从大方向来说,Spark 算子大致可以分为以下两类:
1)TransFormation:变换/转换算子(懒加载):不触发提交作业,完成作业中间过程处理。
TransFormation操作是延迟计算的,也就是说从一个RDD转换生成另一个RDD的转换操作
不是马上执行,需要等到有 Action 操作时才会真正触发运算。
2)Action行动算子:这类算子会触发 SparkContext 提交job作业。
Action算子会触发Spark提交作业(Job),并将数据输出Spark系统。
从小方向来说,Spark算子大致分以下三类:
1)Value数据类型的Transformation算子,这种变换并不触发提交作业,针对处理的数据项是Value型的数据。
2)Key-Value数据类型的Transformation算子,这种变换并不触发提交作业,针对处理的数据项是Key-Value型的数据对。
3)Action算子,这类算子会触发SparkContext提交Job作业。
1)Value 数据类型的Transformation算子
一丶输入分区与输出分区一对一
1、map算子
2、flatMap算子
3、mapParitions算子
4、glom算子
二、输入分区与输出分区多对一
5、union算子
6、cartesian算子
三、输入分区与输出分区多对多
7、groupBy算子
四、输出分区为输入分区子集
8、filter算子
9、distinct算子
10、subtract算子
11、sample算子
12、takeSample算子
五、Cache
13、cache算子
14、persist算子
2)key-Value数据类型的Transformation算子
一、输入分区与输出分区一对一
15、mapValues算子
二、对单个RDD或两个RDD聚集
单个RDD聚集:
16、combinerByKey算子
17、reduceByKey算子
18、partitionBy算子
两个RDD聚集
19、Cogroup算子
三、连接
20、join算子
21、leftOutJoin和rightOutJoin算子
3)Action算子
一:无输出
22、foreach算子
二:HDFS
23、saveAsTextFile算子
24、saveAsObject算子
三:Scala集合和数据类型
25、collect算子
26、collectAsMap算子
27、reduceByKeyLocally算子
28、lookup算子
29、count算子
30、top算子
31、reduce算子
32、fold算子
33、aggregate算子
1.Transformations 算子
--map
将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的函数.
def map(sc: SparkContext) = {
val rdd: RDD[Int] = sc.parallelize(Array(1, 2, 3, 4, 5), (3))
println(rdd.map(x => x * 100).collect().toBuffer)
//Res:ArrayBuffer(100, 200, 300, 400, 500)
}
--flatMap
将原来RDD中的每个元素通过函数转换为新的元素,并将生成的RDD的每个集合中的元素合并为一个集合。
def flatMap(sc: SparkContext) = {
val rdd: RDD[String] = sc.parallelize(Array("ab","cd","ef"))
println( rdd.flatMap(x => x+"@").collect().toBuffer)
rdd.flatMap(x=>x+"#").foreach(print(_))
//res:ArrayBuffer(a, b, @, c, d, @, e, f, @)
//res:ab#cd#ef#
}
--mapPartitions
mapPartitions函数获取到每个分区的迭代器,在函数中通过这个分区整体的迭代器对整个分区的元素进行操作。
效果和map一样,只是操作对象是一个迭代器。对分区的操作。map是对每个元素的操作。
def mapPartitions(sc: SparkContext) = {
val rdd: RDD[Int] = sc.parallelize(Array(1, 2, 3, 4, 5, 6), (3))
//rdd.mapPartitions(i