详解 Spark RDD 的转换 *** 作与行动 *** 作

详解 Spark RDD 的转换 *** 作与行动 *** 作,第1张

详解 Spark RDD 的转换 *** 作与行动 *** 作

前言

本期继续讲解 Spark 核心 RDD 编程部分,内容比较干货也比较长,建议大家先收藏。

学习目标

  • RDD 的创建
  • RDD 的转换 *** 作
  • RDD 的行动 *** 作
  • 惰性求值

1. RDD 的创建

Spark 提供了两种创建 RDD 的方式:对一个集合进行并行化 *** 作和利用外部数据集生成 RDD 。

对一个集合进行并行化 *** 作

Spark 创建 RDD 最简单的方式就是把已经存在的集合传给 parallelize() 方法,不过,这种方式在开发中并不常用,毕竟需要将整个的数据集先放到一个节点内存中。

利用 parallelize() 方法将已经存在的一个集合转换为 RDD,集合中的数据也会被复制到 RDD 中并参与并行计算

val lines = sc.parallelize(Arrays.asList(1,2,3,4,5),n)

其中,n 为并行集合的分区数量,Spark 将为集群的每个分区都运行一个任务。该参数设置太小不能很好地利用 CPU,设置太大又会导致任务阻塞等待,一般 Spark 会尝试根据集群的 CPU 核数自动设置分区数量。

利用外部数据集生成 RDD

在开发中,Spark 创建 RDD 最常用的一个方式就是从 Hadoop 或者其他外部存储系统创建 RDD,包括本地文件系统、HDFS、Cassandra、Hbase、S3 等。

通过 SparkContext 的 textFile() 方法来读取文本文件创建 RDD 的代码,如下:

val lines = sc.textFile("../temp.txt")

其中,textFile() 方法的 url 参数可以是本地文件或路径、HDFS路径等,Spark 会读取该路径下所有的文件,并将其作为数据源加载到内存生成对应的 RDD。

当然, RDD 也可以在现有 RDD 的基础上经过算子转换生成新的 RDD,这是接下来要讲的RDD 算子转换的内容,Spark RDD 支持两种类型的 *** 作:转换 *** 作(Transformation) 和行动 *** 作(Action)。

2. RDD 的转换 *** 作

转换 *** 作是指从现有 RDD 的基础上创建新的 RDD,是返回一个新 RDD 的 *** 作。转换 *** 作是惰性求值的,也就是不会立即触发执行实际的转换,而是先记录 RDD 之间的转换关系,只有当触发行动 *** 作时才会真正地执行转换 *** 作,并返回计算结果。

举个栗子,有一个日志文件 log.txt,需要从里面若干条信息中,筛选出其中错误的报警信息,我们可以用转化 *** 作 filter() 即可完成,代码如下:

val inputRDD = sc.textFile("log.txt")
val errorsRDD = inputRDD.filter(line => line.contains("error"))

其中,textFile() 方法定义了名为 inputRDD 的RDD,但是此时 log.txt 文件并没有加载到内存中,仅仅是指向文件的位置。然后通过 filter() 方法进行筛选定义了名为 errorsRDD 的转换RDD,同样也属于惰性计算,并没有立即执行。

3. RDD 的行动 *** 作

了解了如何通过转换 *** 作从已有的 RDD 中创建一个新的 RDD,但有时我们希望可以对数据集进行实际的计算。行动 *** 作就是接下来要讲的第二种 RDD *** 作,它会强制执行那些求值必须用到的 RDD 的转换 *** 作,并将最终的计算结果返回给 Driver 程序,或者写入到外部存储系统中。

继续刚才的栗子,我们需要将上一步统计出来的报警信息的数量打印出来,我们可以借助count() 方法进行计数。

val countRDD = errorsRDD.count()

其中,count() 可以触发实际的计算,强制执行前面步骤中的转换 *** 作。实际上,Spark RDD 会将 RDD 计算分解到不同的 Stage 并在不同的节点上进行运算,每个节点都会运行 count() 结果,所有运算完成之后会聚合一个结果返回给 Driver 程序。

如果分不清楚给定的一个 RDD *** 作方法是属于转换 *** 作还是行动 *** 作,去看下它的返回类型,转换 *** 作返回的是 RDD 类型,而行动 *** 作则返回的是其他的数据类型。

4. 惰性求值

前面,我们多次提到转换 *** 作都是惰性求值,这也就意味着调用的转换 *** 作(textFile、filter等)时,并不会立即去执行,而是 Spark 会记录下所要求执行的 *** 作的相关信息。

因此,我们对 RDD 的理解应该更深一步,不仅要它看作是一个存放分布式数据的数据集,而且也可以把它当作是通过转换 *** 作构建出来的、记录如何计算数据的指令列表。

惰性 *** 作避免了所有 *** 作都进行一遍 RDD 运算,它可以将很多 *** 作合并在一起,来减少计算数据的步骤,提高 Spark 的运算效率。


以上是本期分享,如有帮助请 点赞+关注+收藏 支持下哦~
下期继续讲解 RDD 内容。

往期精彩内容回顾:

1 - Spark 概述(入门必看)
2 - Spark 的模块组成
3 - Spark 的运行原理
4 - RDD 概念以及核心结构
5 - Spark RDD 的宽窄依赖关系
6 - 详解 Spark RDD 的转换 *** 作与行动 *** 作

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5698857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存