1月19日

spark中的算子分为两类: [or 三类 ]

说明:

RDD一旦创建不能修改,但是可以使用算子让一个RDD转换成新的RDD,这个过程的所有操作都要基于算子进行操作。

1--transformation  转换类算子 :

根据数据集创建一个新的数据集,计算后返回一个新RDD;例如:一个rdd进行map操作后生了一个新的rdd。 

RDD中的所有转换都是延迟加载的,也就是说,它们并不会直接计算结果。相反的,它们只是记住每个RDD之间的转换动作。只有当发生一个要求返回结果给Driver的动作时,这些转换才会真正运行。这种设计的优点是让Spark更加有效率地运行。

 

2-action  行动类算子 :

立即执行,不会生成新的RDD.如果没有行动类算子,那么程序只会被加载[读取]不会被执行。

程序遇见action(行动)就会执行,不会转换为新的RDD,代表一个任务的结尾,不是一个应用的结尾。action算子只能将RDD的数据进行打印,收集到Driver端或者存储到其他介质中。

所以程序执行RDD的时候如果触发action算子,那么就会触发 SparkContext 提交 Job 作业,这就是就是action算子。

3-控制类算子 :

Spark中控制算子也是懒执行的,需要Action算子触发才能执行,主要是为了对数据进行缓存。当有Action算子出现时,他才会真正的执行

其中延迟计算就是懒执行的意思,就像是创建了一个视图,他并不是把查询好的数据放入视图了,而是当你需要这些数据时,查看视图时,他才执行定义视图时候的SQL语句。

 

转换类算子:

1-map 算子: A(1 2 3)---.map----1 2 3 计算
rdd的分区数量不会发生改变。

数据一一映射的关系,有多少条数据就会迭代多少次: 会去遍历每一个元素

map方法被调用了一次,map方法中需要一个函数,而函数[内容]被迭代了N次。

 

2-mapValuess 算子: [k  v 数据]

rdd的分区数量不会发生改变。

数据一一映射的关系,有多少条数据就会迭代多少次:

mapValues算子只操作value,不管key。

示例:
val a=List(("zhangsan",2000),("lisi",4000),("wangwu",3000),("zhaoliu",2300))
val rdd1: RDD[(String, Int)] = sc.makeRDD(a)
val rdd2: RDD[(String, Int)] = rdd1.mapValues(a=>a+10000) //or:rdd1.mapValues(_+20000)
rdd2.collect().foreach(println)


3-mapPartitons 算子:

以分区为单位,分区数量不发生改变:

遍历每个分区,参数是迭代器的形式,直接迭代分区中的数据,减少迭代的次数。

示例:

val data=List(("zhangsan",2000),("lisi",4000),("wangwu",3000),("zhaoliu",2300))
val rdd1: RDD[(String, Int)] = sc.makeRDD(data)
val rdd2 = rdd1.mapPartitions(a=>a.map(b=>(b._1,b._2+20000)))
a=迭代器,也可以理解为每个分区中的数据;需要将迭代器中数据进行遍历,然后获取到每个元组,将每个元组中的数据中的第二个元素+20000; 
posted @ 2022-01-19 21:40  不咬牙  阅读(107)  评论(0)    收藏  举报