1. 什么是RDD?(**彈性分布式數(shù)據(jù)集**,是spark中最基本的數(shù)據(jù)抽象,它代表一個不可變、可分區(qū)、里面的元素可并行計算的集合)
- **R(Resilient)**: 表示彈性,rdd內(nèi)部的元素可以存在磁盤也可存在內(nèi)存中
- **D(Distributed)**: 它內(nèi)部的元素進(jìn)行了分布式存儲,方便后期的分布式計算
- **D(Dataset)**: 它就是一個集合,存儲很多數(shù)據(jù)
2. RDD的五大屬性
1)A list of partitions, **數(shù)據(jù)集的基本組成單位**
```
一個RDD有很多分區(qū),每個分區(qū)內(nèi)部包含了該rdd的部分?jǐn)?shù)據(jù)。
```
2)A function for computing each split, **一個計算每個分區(qū)的函數(shù)**
```
Spark中的RDD的計算是以分區(qū)為單位的,每個RDD都會實現(xiàn)compute計算函數(shù)以達(dá)到整個目的。
```
3)A list of dependencies on other RDDs, **一個RDD可以依賴其他多個rdd**
```
這里涉及到rdd與rdd之間的依賴關(guān)系,spark的容錯機制就是根據(jù)這個特性而來。
```
4)Optionally, a partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned), **一個Partitioner,即RDD的分區(qū)函數(shù)(可選項)**
```
當(dāng)前Spark(版本)中實現(xiàn)了兩種類型的分區(qū)函數(shù):HashPartitioner&RangePartitioner.只有對于key-value的RDD,并且產(chǎn)生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的優(yōu)先位置(可選項)**
```
這里涉及到數(shù)據(jù)的本地性,數(shù)據(jù)塊位置最優(yōu)。spark任務(wù)在調(diào)度的時候會優(yōu)先考慮存有數(shù)據(jù)的節(jié)點開啟計算任務(wù),減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸,提升計算效率。
```
3. RDD的創(chuàng)建方式
- 通過已經(jīng)存在的scala集合去構(gòu)建
```
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))
```
- 加載外部的數(shù)據(jù)源去構(gòu)建
```
val rdd1=sc.textFile("/words.txt")
```
- 從已經(jīng)存在的rdd進(jìn)行轉(zhuǎn)換生成一個新的rdd
```
val rdd2=rdd1.flatMap(_.split(" "))
val rdd3=rdd2.map((_,1))
```
4. RDD的算子分類
- transformation(轉(zhuǎn)換)
- 根據(jù)已經(jīng)存在的rdd轉(zhuǎn)換生成一個新的rdd,它是延遲加載,它不會立即執(zhí)行
- 例如
- map/flatMap/reduceByKey等
- action(動作)
- 它會真正觸發(fā)任務(wù)的執(zhí)行
- 將rdd的計算的結(jié)果數(shù)據(jù)返回給Driver端,或者是保存結(jié)果數(shù)據(jù)到外部存儲介質(zhì)中
- 例如
- collect/saveAsTextFile等
5. RDD常見的算子操作說明
- **transformation算子**
轉(zhuǎn)換 |含義 |
--- | --- |
map(func) | 返回一個新的RDD,該RDD由每一個輸入元素經(jīng)過func函數(shù)轉(zhuǎn)換后組成 |
filter(func)|返回一個新的RDD,該RDD經(jīng)過func函數(shù)計算后返回值為true的輸入元素組成|
flatMap(func)|類似于map,但是每一個輸入元素可以被映射為0或多個輸出元素(所以func應(yīng)該反回一個序列,而不是單一元素)
mapPartitions(func)|類似于map,但獨立在RDD的每一個分片上運行,因此在類型為T的RDD上運行時,func函數(shù)類型必須是Iterator[T]=>Iteator[U} |
mapPartitionsWithIndex(func)| |
union(otherDataset)| |
intersection(other Datesel)| |
- action算子