### RDD 操作
RDDs 支持 2 種類型的操作:
* 轉換(transformations)_ 從已經存在的數據集中創建一個新的數據集;Transformation屬于延遲計算,當一個RDD轉換成另一個RDD時并沒有立即進行轉換,僅僅是記住了數據集的邏輯操作。
* 動作(actions)_ 在數據集上進行計算之后返回一個值到驅動程序。觸發Spark作業的運行,真正觸發轉換算子的計算。
在 Spark 中,**所有的轉換(transformations)都是惰性(lazy)的**,它們不會馬上計算它們的結果。相反的,它們僅僅記錄轉換操作是應用到哪些基礎數據集(例如一個文件)上的。轉換僅僅在這個時候計算:當動作(action) 需要一個結果返回給驅動程序的時候。這個設計能夠讓 Spark 運行得更加高效。
默認情況下,每一個轉換過的 RDD 會在每次執行動作(action)的時候重新計算一次。然而,你也可以使用 `persist` (或 `cache`)方法持久化(`persist`)一個 RDD 到內存中。在這個情況下,Spark 會在集群上保存相關的元素,在你下次查詢的時候會變得更快。在這里也同樣支持持久化 RDD 到磁盤,或在多個節點間復制。
### 用一個程序理解上面的內容
為了說明 RDD 基本知識,考慮下面的簡單程序:
```scala
val lines = sc.textFile("data.txt")
val lineLengths = lines.map(s => s.length)
val totalLength = lineLengths.reduce((a, b) => a + b)
```
* 第一行是定義來自于外部文件的 RDD。這個數據集并沒有加載到內存或做其他的操作:`lines` 僅僅是一個指向文件的指針。
* 第二行是定義 `lineLengths`,它是 `map` 轉換(transformation)的結果。同樣,`lineLengths` 由于懶惰模式也_沒有_立即計算。
* 最后,我們執行 `reduce`,它是一個動作(action)。在這個地方,Spark 把計算分成多個任務(task),并且讓它們運行在多個機器上。每臺機器都運行自己的 map 部分和本地 reduce 部分。然后僅僅將結果返回給驅動程序。
如果我們想要再次使用 `lineLengths`,我們可以添加:
```scala
lineLengths.persist()
```
在 `reduce` 之前,它會導致 `lineLengths` 在第一次計算完成之后保存到內存中。
- Introduction
- 快速上手
- Spark Shell
- 獨立應用程序
- 開始翻滾吧!
- RDD編程基礎
- 基礎介紹
- 外部數據集
- RDD 操作
- 轉換Transformations
- map與flatMap解析
- 動作Actions
- RDD持久化
- RDD容錯機制
- 傳遞函數到 Spark
- 使用鍵值對
- RDD依賴關系與DAG
- 共享變量
- Spark Streaming
- 一個快速的例子
- 基本概念
- 關聯
- 初始化StreamingContext
- 離散流
- 輸入DStreams
- DStream中的轉換
- DStream的輸出操作
- 緩存或持久化
- Checkpointing
- 部署應用程序
- 監控應用程序
- 性能調優
- 減少批數據的執行時間
- 設置正確的批容量
- 內存調優
- 容錯語義
- Spark SQL
- 概述
- SparkSQLvsHiveSQL
- 數據源
- RDDs
- parquet文件
- JSON數據集
- Hive表
- 數據源例子
- join操作
- 聚合操作
- 性能調優
- 其他
- Spark SQL數據類型
- 其它SQL接口
- 編寫語言集成(Language-Integrated)的相關查詢
- GraphX編程指南
- 開始
- 屬性圖
- 圖操作符
- Pregel API
- 圖構造者
- 部署
- 頂點和邊RDDs
- 圖算法
- 例子
- 更多文檔
- 提交應用程序
- 獨立運行Spark
- 在yarn上運行Spark
- Spark配置
- RDD 持久化