Spark基礎(chǔ)入門之深入理解RDD

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容