Spark算子

作者:翁松秀


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 :同时在内存和磁盘中持久化,且将数据复制到集群的两个节点中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翁松秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值