作者:翁松秀
文章目录
Spark之RDD算子
Spark计算框架中的核心数据结构是RDD(弹性分布数据集),通过将数据生成RDD,然后对RDD进行变换,以获得最终需要的计算结果。
RDD算子:Spark计算框架中定义的对RDD进行操作的各类函数,主要包括创建算子、变换算子、行动算子和缓存算子。
1. 创建算子
1.1 基于集合型数据创建RDD
- SparkContext. makeRDD一一创建RDD
- SparkContext. parallelize 一一数据并行化生成RDD
1.2 基于外部数据创建RDD
Spark支持从外部文本文件和Hadoop文件系统HDFS中的数据创建RDD。
- Spark.Context.textFile一一基于文本文件创建RDD
- SparkContext.wholeTextFiles一一基于一个目录下的全部文本文件创建RDD
- SparkContext.newAPffiadoopFile一一基于Hadoop文件创建RDD
- SparkContext.newAPiliadoopRDD一一基于Hadoop数据创建RDD
2. 变换算子
变换算子就是对RDD进行操作的接口函数,作用是将一个或者多个RDD变换成新的RDD。主要分为:
①对Value型RDD进行变换的算子;
②对Key/Value型RDD(或称PairRDD )进行变换的算子;
2.1 对Value型RDD进行变换
2.1.1 对单个Value 型的RDD 进行变换
-
map-map 变换
将指定函数作用于当前RDD的每个元素,形成一个新的RDD。
-
coalesce一一重新分区
将当前RDD进行重新分区,生成一个以numPartitions 参数指定的分区数存储的新RDD。
-
distinct一一去重
返回原RDD中所有元素去重后的结果。
-
filter一一过滤
原RDD中的所有元素,通过输入指定参数的过滤函数进行判别,使过滤函数返因为true 的所有元素构成一个新的RDD 。
- flatMap一一flatMap变换
对原RDD中的每个元素用指定函数进行一对多(这也是flat前缀的由来)的变换,然后将转换后的结果汇聚生成新RDD。
- pipe一一调用Shell命令
在Linux操作系统中,提供了很多能对数据进行处理的shell命令。为了利用上这些命令的能力, Spark提供了pipe变换。利用pipe变换,可以对原RDD的每个分区执行由command参数指定的shell命令,并生成新的RDD。
- sample一一抽样
对原始RDD中的元素进行随机抽样,抽样后产生的元素集合构成新的RDD。
- sortBy一一排序
对原RDD中的元素按照函数指定的规则进行排序,排序后的结果生成新的RDD。
2.1.2 对两个Value 型的RDD 进行变换
- cartesian一一笛卡尔积
输入参数为另一个RDD,返回两个RDD中所有元素的笛卡尔积。
- intersection一一交集
输入参数为另一个RDD,返回两个RDD中所有元素的交集。
- subtract一一补集
输入参数为另一个RDD,返回原始RDD与输入参数RDD的补集。
- union一一并集
输入参数为另一个RDD,返回原始RDD与输入参数RDD的并集。
- zip一一联结
输入参数为另一个RDD,zip 变换生成由原始RDD的值为Key、输入参数RDD的值为Value依次配对构成的所有Key/Value 对,并返回这些Key/Value 对集合构成的新RDD 。
2.2 对Key/Value型RDD进行变换
2.2.1 创建Key/Value 型RDD
- 使用map创建Key/Value 型RDD
- 使用keyBy建Key/Value型RDD
2.2.2 对单个Key/Value型RDD进行变换
-
combineByKey一一按Key聚合
flatMapValues一一对所有Value进行flatMap
-
groupByKey一一按Key汇聚
-
-
keys一一提取Key
-
-
mapValues一一对Value值进行变换
-
-
partitionBy一一按Key值重新分区
将Key/Value型RDD中的元素按照输入参数partitionBy指定的分区规则进行重新分区,生成新的RDD。
。
-
reduceByKey一一按Key值进行Reduce操作
-
-
sortByKey一一按Key值排序
对原RDD 中的元素按照Key 值进行排序,并可使用参数ascending 指定按照升序或者降序进行排列,排序后的结果生成新的RDD
-
values
对Key/Value型的RDD进行取值操作,即将RDD转化为只有元素的Value值构成的新RDD。
2.2.3 对两个Key/Value 型RDD 进行变换
-
cogroup一一按Key值聚合
-
join一一按Key值连接
-
leftOuterJoin一一按Key值进行左外连接
-
rightOuterJoin一一按Key值进行右外连接
-
subtractByKey一一按Key值求补
3. 行动算子
Spark “惰性执行”机制,就是Spark 中的变换算子并不是在运行到相应语句时就会立即执行,而是在遇到行动(Action)算子语句时,才会真正触发Spark的任务调度开始进行计算,这也是为什么这类算子被称为“行动”算子的原因。行动算子主要分为两类:
①数据运算类,该类算子的作用是触发RDD计算,并得到计算结果返回给Spark程序或Shell界面。
②数据存储类,该类算子在触发RDD计算后,将结果保存到外部存储系统中,例如HDFS文件系统或数据库。
3.1 数据运算类
-
reduce一一Reduce操作
在Hadoop中,reduce 操作是将指定的函数作用在Key值相同的全部元素上。而Spark 的reduce操作则是对所有元素依次进行相同的函数计算。 -
aggregate一一聚合操作
-
collect——收集元素
-
collectAsMap一一收集Key/Value型RDD中的元素
-
count一一计算元素个数
-
countByKey一一按Key值统计Key/Value型RDD中的元素个数
-
countByValue一一统计RDD中元素值出现的次数
-
first——得到首个元素
-
glom一一返回分区情况
-
fold-合并
-
foreach一一逐个处理RDD元素
-
lookup一一查找元素
-
max一一求最大值
-
min一一求最小值
-
take一一获取前n个元素
-
takeOrdered一一获取排序后的前n个元素
-
takeSample一一提取n个样本
-
top一一寻找值最大的前几个元素
3.2 数据存储类
- saveAsObjectFile一一存储为二进制文件
- saveAsTextFile一一存储为文本文件
- saveAsNewAPIHadoopFile一一存储为Hadoop文件
- saveAsNewAPilladoopDataset——存储为Hadoop数据集
4. 缓存算子
为了提高计算效率, Spark采用了两个重要机制:
①基于分布式内存数据集进行运算,也就是我们已经熟知的RDD;
②变换算子的惰性执行 (Lazy Evaluation),即RDD的变换操作并不是在运行到该行代码时立即执行,而仅记录下转换操作的操作对象。只有当运行到一个行动算子代码时,变换操作的计算逻辑才真正执行。
这两个机制帮助Spark 提高了运算效率,但正如“硬币都有两面”一样,在带来提升性能的好处的同时,这两个机制也留下了隐患。例如:
①如果在计算过程中,需要反复使用某个RDD,而该RDD 需要经过多次变换才能得到,则每次使用该RDD 时都需要重复这些变换操作,这种运算效率是很低的;
②在计算过程中数据存放在内存中,如果出现参与计算的某个节点出现问题,则存放在该节点内存中的RDD 数据会发生损坏。如果损坏的也是需要经过多次变换才能得到的RDD,此时虽然可以通过再次执行计算恢复该RDD,但仍然要付出很大的代价。
因此, Spark 提供了一类缓存算子,以帮助用户解决此类问题。
- cache一一缓存RDD
缓存算子的缓存策略:
-
MEMORY_ONLY_SER :仅在内存中持久化,且将RDD 作为序列化的Java 对象存储(每个分区一个byte 数组) 。这种方式比MEMORY_ ONLY 方式要更加节省空间,但会耗费更多的CPU 资源进行序列化操作。
-
MEMORY_ONLY_2 :仅在内存中持久化,且将数据复制到集群的两个节点中。
-
MEMORY_AND_DISK : 同时在内存和磁盘中持久化,且将RDD 作为非序列化的Java 对象存储。
-
MEMORY _AND _DISK_SER :同时在内存和磁盘中持久化,且将RDD 作为序列化的Java 对象存储。
MEMORY_AND_DISK_2 :同时在内存和磁盘中持久化,且将数据复制到集群的两个节点中。