RDD相关概念

RDD概念:

RDD 定义为弹性分布式数据集,包含了只读的、分区的、分布式计算的概念;RDD是个类
1、一个数据分区的列表(hdfs的所有数据块的位置信息,保存在RDD类成员变量Array中)
2、保存了数据块上面的计算方法,这个计算方法会应用到每一个数据块
3、一个对其他RDD的依赖,是一个集合,spark就是通过这种依赖关系,像流水一样处理我们的数据
   当分区的数据计算失败,只需要根据流水线的信息,重新计算这一个分区的数据即可,不需要计算全部数据
4、分区方式(partitioner),决定RDD数据来源的分区和数据计算后的分区:hashpartitioner;rangepartitioner
5、位置相关性

RDDS的血统关系图:

spark维护着RDDS之间的依赖关系,叫做血统关系图
spark使用血统关系图来计算每个RDD的需求和恢复丢失数据

延迟计算(lazy Evaluation)

Spark 对RDDS的计算是 ,他们第一次使用action的时候
这种方式在处理大数据的时候特别有用,可以减少数据的传输
spark内部记录metadata表名transformations操作已经被响应了
加载数据也是延迟计算,数据只有在必要时候,才会被加载进去
 

narrow dependency(窄依赖)和wide dependency( 宽依赖)的概念。

父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。
宽依赖和窄依赖的边界就是stage的划分点。

### Pyspark 中 RDD概念及用法 #### 什么是 RDD? Resilient Distributed Dataset (RDD) 是 Apache Spark 的核心抽象,表示一个不可变的、分区化的数据集合[^2]。这些数据可以分布在集群中的多个节点上,并支持并行计算。 #### RDD 的特性 1. **弹性**:RDD 支持自动容错机制,在数据丢失或任务失败的情况下能够从其他副本中恢复数据。 2. **分布性**:数据被划分为多个分片(Partition),可以在不同的机器上进行处理。 3. **只读性**:一旦创建,RDD 数据无法修改,但可以通过转换操作生成新的 RDD。 4. **惰性求值**:所有的转换操作都是懒执行的,只有遇到行动算子时才会触发实际计算[^5]。 #### 创建 RDD 的方式 Pyspark 提供了两种主要的方式来创建 RDD: 1. **基于本地集合**:通过 `parallelize` 方法将 Python 列表转化为分布式 RDD。 ```python rdd = sc.parallelize([1, 2, 3, 4]) ``` 这种方法适用于测试环境下的小型数据集[^1]。 2. **基于外部存储**:可以从 HDFS、S3 或其他分布式文件系统加载数据到 RDD。 ```python rdd = sc.textFile("hdfs://path/to/file.txt") ``` #### 常见的操作分类 1. **Transformation 转换操作** - 对现有 RDD 执行某些函数以生成新 RDD。 - 示例:`map`, `filter`, `union`, `join` 等。 ```python # 使用 map 将每个元素加倍 rdd_mapped = rdd.map(lambda x: x * 2) # 使用 filter 筛选出大于 2 的元素 rdd_filtered = rdd.filter(lambda x: x > 2) ``` 2. **Action 行动操作** - 触发实际计算并将结果返回给驱动程序或保存到外部存储。 - 示例:`collect`, `count`, `take`, `saveAsTextFile` 等。 ```python # 获取所有元素 result = rdd.collect() # 统计元素数量 count_result = rdd.count() ``` #### 缓存与持久化 为了优化性能,Spark 提供了缓存 API (`persist` 和 `cache`),允许将频繁使用的 RDD 存储在内存或磁盘中[^3]。 ```python rdd.cache() # 默认缓存在内存中 result = rdd.collect() # 后续对该 RDD 的操作可以直接利用缓存 ``` #### 特殊操作示例 1. **Union 操作**:合并两个 RDD,保留重复项[^4]。 ```python rdd1 = sc.parallelize([1, 2, 3]) rdd2 = sc.parallelize([3, 4, 5]) union_rdd = rdd1.union(rdd2) print(union_rdd.collect()) # 输出 [1, 2, 3, 3, 4, 5] ``` 2. **Glom 操作**:按分区收集数据为嵌套列表。 ```python rdd = sc.parallelize([1, 2, 3, 4, 5], 2) glommed_rdd = rdd.glom().collect() print(glommed_rdd) # 输出 [[1, 2, 3], [4, 5]] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值