1. 什么是RDD?(**弹性分布式数据集**,是spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合)
- **R(Resilient)**: 表示弹性,rdd内部的元素可以存在磁盘也可存在内存中
- **D(Distributed)**: 它内部的元素进行了分布式存储,方便后期的分布式计算
- **D(Dataset)**: 它就是一个集合,存储很多数据
2. RDD的五大属性
1)A list of partitions, **数据集的基本组成单位**
```
一个RDD有很多分区,每个分区内部包含了该rdd的部分数据。
```
2)A function for computing each split, **一个计算每个分区的函数**
```
Spark中的RDD的计算是以分区为单位的,每个RDD都会实现compute计算函数以达到整个目的。
```
3)A list of dependencies on other RDDs, **一个RDD可以依赖其他多个rdd**
```
这里涉及到rdd与rdd之间的依赖关系,spark的容错机制就是根据这个特性而来。
```
4)Optionally, a partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned), **一个Partitioner,即RDD的分区函数(可选项)**
```
当前Spark(版本)中实现了两种类型的分区函数:HashPartitioner&RangePartitioner.只有对于key-value的RDD,并且产生shuffle,才会有partitioner,非key-value的RDD的partitioner的值是None.
```
5)Optionally,a list of preferred locations to compute each split on (e.g. block locations for an HDFS file), **一个列表,存储每个partition的优先位置(可选项)**
```
这里涉及到数据的本地性,数据块位置最优。spark任务在调度的时候会优先考虑存有数据的节点开启计算任务,减少数据的网络传输,提升计算效率。
```
3. RDD的创建方式
- 通过已经存在的scala集合去构建
```
val rdd1=sc.parallelize(List(1,2,3,4))
val rdd2=sc.parallelize(Array("hadoop","hive","spark"))
val rdd3=sc.makeRDD(List(1,2,3,4))
```
- 加载外部的数据源去构建
```
val rdd1=sc.textFile("/words.txt")
```
- 从已经存在的rdd进行转换生成一个新的rdd
```
val rdd2=rdd1.flatMap(_.split(" "))
val rdd3=rdd2.map((_,1))
```
4. RDD的算子分类
- transformation(转换)
- 根据已经存在的rdd转换生成一个新的rdd,它是延迟加载,它不会立即执行
- 例如
- map/flatMap/reduceByKey等
- action(动作)
- 它会真正触发任务的执行
- 将rdd的计算的结果数据返回给Driver端,或者是保存结果数据到外部存储介质中
- 例如
- collect/saveAsTextFile等
5. RDD常见的算子操作说明
- **transformation算子**
转换 |含义 |
--- | --- |
map(func) | 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 |
filter(func)|返回一个新的RDD,该RDD经过func函数计算后返回值为true的输入元素组成|
flatMap(func)|类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该反回一个序列,而不是单一元素)
mapPartitions(func)|类似于map,但独立在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func函数类型必须是Iterator[T]=>Iteator[U} |
mapPartitionsWithIndex(func)| |
union(otherDataset)| |
intersection(other Datesel)| |
- action算子