RDD编程

本文深入探讨了Spark的RDD编程,包括如何从文件系统和并行集合创建RDD,详细介绍了reduceByKey、groupByKey、keys、values、mapValues及join等操作。还讨论了RDD的持久化机制,解释了如何利用persist()方法提高效率,并阐述了广播变量和累加器在优化计算过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 RDD创建

RDD创建有两种形式,1:从外部读取数据源,外部可指本地系统、HDFS系统等;2:调用SparkContext的parallelize方法,在Driver中一个已经存在的集合(数组)上创建。

1.1 演示前提
启动hadoop和spark-shell
>>start-dfs.sh   //启动hadoop
>>sprak-shell  //启动spark
>>hadoop fs -copyFromLocal /home/hadoop/sample.txt input
//将本地文件上传到分布式系统

在这里插入图片描述

1.2 从文件系统中加载数据创建RDD

在这里插入图片描述

1.3 通过并行集合创建RDD

在这里插入图片描述

2 RDD操作

RDD操作一般为转换和行动操作,转换表示一种RDD转换为另一种RDD,行动表示在RDD上进行非修改性操作。

常用转换操作:说明
filter(func)筛选出满足函数func的元素,并返回一个新的数据。
map(func)将每个元素传递到函数func中,并将结果返回为一个新的数据集
flatMap(func)与map()相似,但每个输入元素都可以映射到0或多个输出结果
groupByKey()应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集
reduceByKey(func)应用于(K,V)键值对的数据集时,返回一个新的(K,V)形式的数据集,其中的每个值是将每个key传递到函数func中进行聚合.
常用行动操作:说明
count()返回数据集中的元素个数
collect()以数组的形式返回数据集中的所有元素
first()返回数据集中的第一个元素
take(n)以数组的形式返回数据集中的前n个元素 reduce(func) 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
foreach(func)将数据集中的每个元素传递到函数func中运行*:
2.1 reduceByKey(func)演示

在这里插入图片描述

1:首先使用parallelize()方法创建RDD  《key,value》
2:然后进行显示创建的结果
3:将key之相同的集合进行合并,a和b代表value
4:将处理后的集过进行显示
2.2 groupByKey()演示

在这里插入图片描述

1:原来的RDD显示
2:进行groupByKey操作
3:显示新的RDD
2.3 keys演示

在这里插入图片描述

1:原来的RDD
2:进行keys转换
3:显示keys
2.4 values显示

在这里插入图片描述

1:显示原来的RDD
2:进行values操作
2:显示新的RDD
2.5 mapValues(func)演示

在这里插入图片描述

1:原来的RDD显示
2:进行mapValue操作
3:显示新的RDD
2.6 join操作

在这里插入图片描述

1:创建两个RDD
2:进行join操作
2:显示新的RDD
3 持久化

RDD惰性机制:当进行RDD转换时必不会进行实际的操作,只有遇到行动时才会触发真正的执行。如果遇到大量行动操作,每次行动都需要从头开始会付出很大代价,通过持久化(缓存)机制避免这种重复计算的开销。
使用persist()方法对一个RDD标记为持久化,并不会马上计算生成RDD并把它持久化,而是要等到遇到第一个行动操作触发真正计算以后,才会把计算结果进行持久化,持久化后的RDD将会被保留在计算节点的内存中被后面的行动操作重复使用。

4 广播变量

每个阶段内的所有任务所需要的公共数据,Spark都会自动进行广播。通过广播方式进行传播的变量,会经过序列化,然后在被任务使用时再进行反序列化。
在这里插入图片描述

1:创建广播变量
2:读取广播变量的值
5 累加器

在这里插入图片描述

1:创建RDD
2:创建累加器
3:进行累加
4:显示累加器的值
### 关于 RDD 编程的基础知识 RDD(Resilient Distributed Dataset),即弹性分布式数据集,是 Spark 的核心概念之一。它是一个只读的分区记录集合,可以在集群节点之间高效分发并执行计算。 #### 创建 RDD 的主要方式 创建 RDD 通常可以通过以下三种方式进行[^1]: 1. **通过集合创建 RDD**: 可以利用 `SparkContext.parallelize` 方法将内存中的集合转换为 RDD。 2. **通过文件创建 RDD**: 利用 `SparkContext.textFile` 方法可以从本地文件系统或者 HDFS 文件中加载数据到 RDD 中。 3. **通过其他 RDD 转换而来**: 基于现有的 RDD 进行各种算子操作后生成新的 RDD。由于 RDD 是不可变的数据结构,每次变换都会返回一个新的 RDD 实例。 --- ### 综合案例分析:学生平均成绩统计 下面展示了一个具体的例子来说明如何使用 RDD 计算每位学生的平均成绩: ```scala val rdd: RDD[String] = sc.textFile("data/rdd/test3") rdd.map(line => (line.split(" ")(0), line.split(" ")(1).toInt)) .map(t => (t._1, (t._2, 1))) .reduceByKey((t1, t2) => (t1._1 + t2._1, t1._2 + t2._2)) .mapValues(t => t._1 / t._2.toFloat) .foreach(println) ``` 上述代码片段实现了如下功能: - 首先调用了 `sc.textFile` 将外部存储的学生分数文件转化为初始的 RDD 数据流; - 接着两次映射分别处理每一行字符串拆分为键值对学生名称及其对应的单科成绩,并进一步累加总成绩与科目数; - 使用 `reduceByKey` 对相同 key 下的成绩总数以及科目数量求和; - 最终再次映射得到每名学生的平均成绩并通过打印输出结果[^2]。 --- ### 更多关于 RDD 编程的知识点 除了基本的操作外,在实际应用过程中还需要掌握一些高级特性: - **Transformation 和 Action**: Transformation 类似 map、filter 等用于定义中间状态变化;而 action 如 collect 或 saveAsTextFile,则触发真正的计算过程并将最终成果展现出来或保存下来。 - **持久化机制(Persistence)**: 当某些 RDD 多次被重复访问时,可以考虑将其缓存至内存 (`persist`) 来提升性能效率。 - **Shuffle 操作的影响**: 减少 shuffle 数量对于优化程序运行时间至关重要,因为这涉及到大量的磁盘 I/O 开销。 --- ### 总结 以上介绍了有关 RDD 编程的一些基础理论及实践技巧,包括其构建途径、典型应用场景下的实现逻辑以及其他值得注意的技术要点等内容。希望这些信息能够帮助您更好地理解和运用这一强大工具!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值