Spark基础入门之深入理解RDD

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算子

6. RDD常用的算子操作演示(略)

你可能感兴趣的:(Spark基础入门之深入理解RDD)