Spark算子和RDD

shuffle

spark的运行过程中如果出现了相同的键被拉取到对应的分区,这个过程称之为shuffle
注:spark的shuffle和mapreduce的shuffle原理是一样,都是要进行落盘

RDD

RDD: 弹性的分布式数据集
弹性:RDD将来在计算的时候,其中的数据可以是很大,也可以是很小
分布式:数据可以分布在多台服务器中,RDD中的分区来自于block块,而今后的block块会来自不同的datanode
数据集:RDD自身是不存储数据的,只是一个代码计算逻辑,今后触发作业执行的时候,数据会在RDD之间流动

RDD的五大特性

5大特性:(面试必会的!!)
1)RDD是由一些分区构成的 读取文件时有多少个block块,RDD中就会有多少个分区
注:默认情况下,所有的RDD中的分区数是一样的,无论是shuffle之前还是shuffle之后的,在最开始加载数据的时候决定的

2)函数实际上是作用在RDD中的分区上的,一个分区是由一个task处理,有多少个分区,总共就有多少个task
注:函数在spark中称之为算子(转换transformation算子  RDD-->RDD,行动action算子 RDD->Other数据类型)

3)RDD之间存在一些依赖关系,后一个RDD中的数据是依赖与前一个RDD的计算结果,数据像水流一样在RDD之间流动
注:
3.1 RDD之间有两种依赖关系
a. 窄依赖  后一个RDD中分区数据对应前一个RDD中的一个分区数据 1对1的关系
b. 宽依赖  后一个RDD中分区数据来自于前一个RDD中的多个分区数据  1对多的关系  shuffle
3.2 因为有了依赖关系,将整个作业划分了一个一个stage阶段  sumNum(stage) = Num(宽依赖) + 1
3.3 窄依赖的分区数是不可以改变,取决于第一个RDD分区数,宽依赖可以在产生shuffle的算子上设置分区数

4)分区类的算子只能作用在kv格式的RDD上,groupByKey reduceByKey
5)spark为task计算提供了精确的计算位置,移动计算而不移动数据
一个spark作业,由最后的一个action算子来触发执行的,若没有action算子,整个作业不执行
RDD具有懒执行的特点

转化算子

map算子:将rdd中的数据,一条一条的取出来传入到map函数中,map会返回一个新的rdd,map不会改变总数据条数
filter: 过滤,将RDD中的数据一条一条取出传递给filter后面的函数,如果函数的结果是true,该条数据就保留,否则丢弃

flatMap算子:将RDD中的数据一条一条的取出传递给后面的函数,函数的返回值必须是一个集合。最后会将集合展开构成一个新的RDD

sample算子:从前一个RDD的数据中抽样一部分数据

groupBy:按照指定的字段进行分组,返回的是一个键是分组字段,值是一个存放原本数据的迭代器的键值对 返回的是kv格式的RDD

groupByKey: 按照键进行分组,将value值构成迭代器返回,将来你在spark中看到RDD[(xx, xxx)] 这样的RDD就是kv键值对类型的RDD
     ,只有kv类型键值对RDD才可以调用groupByKey算子
     
reduceByKeys实现:按照键key对value值直接进行聚合,需要传入聚合的方式reduceByKey算子也是只有kv类型的RDD才能调用

union:上下合并两个RDD,前提是两个RDD中的数据类型要一致,合并后不会对结果进行去重

mapValues算子:也是作用在kv类型的RDD上

mapPartition: 主要作用是一次处理一个分区的数据,将一个分区的数据一个一个传给后面的函数进行处理

行动算子

action算子,触发任务执行。一个action算子就会触发一次任务执行

foreach
sava
posted @ 2024-05-17 22:03  low-reed  阅读(21)  评论(0)    收藏  举报