# RDD 操作
RDDs 支持 2 種類型的操作:*轉換(transformations)* 從已經存在的數據集中創建一個新的數據集;*動作(actions)* 在數據集上進行計算之后返回一個值到驅動程序。例如,`map` 是一個轉換操作,它將每一個數據集元素傳遞給一個函數并且返回一個新的 RDD。另一方面,`reduce` 是一個動作,它使用相同的函數來聚合 RDD 的所有元素,并且將最終的結果返回到驅動程序(不過也有一個并行 `reduceByKey` 能返回一個分布式數據集)。
在 Spark 中,所有的轉換(transformations)都是惰性(lazy)的,它們不會馬上計算它們的結果。相反的,它們僅僅記錄轉換操作是應用到哪些基礎數據集(例如一個文件)上的。轉換僅僅在這個時候計算:當動作(action) 需要一個結果返回給驅動程序的時候。這個設計能夠讓 Spark 運行得更加高效。例如,我們可以實現:通過 `map` 創建一個新數據集在 `reduce` 中使用,并且僅僅返回 `reduce` 的結果給 driver,而不是整個大的映射過的數據集。
默認情況下,每一個轉換過的 RDD 會在每次執行動作(action)的時候重新計算一次。然而,你也可以使用 `persist` (或 `cache`)方法持久化(`persist`)一個 RDD 到內存中。在這個情況下,Spark 會在集群上保存相關的元素,在你下次查詢的時候會變得更快。在這里也同樣支持持久化 RDD 到磁盤,或在多個節點間復制。
### 基礎
為了說明 RDD 基本知識,考慮下面的簡單程序:
~~~
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`,我們可以添加:
~~~
lineLengths.persist()
~~~
在 `reduce` 之前,它會導致 `lineLengths` 在第一次計算完成之后保存到內存中。
- Introduction
- 快速上手
- Spark Shell
- 獨立應用程序
- 開始翻滾吧!
- 編程指南
- 引入 Spark
- 初始化 Spark
- Spark RDDs
- 并行集合
- 外部數據集
- RDD 操作
- RDD持久化
- 共享變量
- 從這里開始
- Spark Streaming
- 一個快速的例子
- 基本概念
- 關聯
- 初始化StreamingContext
- 離散流
- 輸入DStreams
- DStream中的轉換
- DStream的輸出操作
- 緩存或持久化
- Checkpointing
- 部署應用程序
- 監控應用程序
- 性能調優
- 減少批數據的執行時間
- 設置正確的批容量
- 內存調優
- 容錯語義
- Spark SQL
- 開始
- 數據源
- RDDs
- parquet文件
- JSON數據集
- Hive表
- 性能調優
- 其它SQL接口
- 編寫語言集成(Language-Integrated)的相關查詢
- Spark SQL數據類型
- GraphX編程指南
- 開始
- 屬性圖
- 圖操作符
- Pregel API
- 圖構造者
- 頂點和邊RDDs
- 圖算法
- 例子
- 提交應用程序
- 獨立運行Spark
- 在yarn上運行Spark
- Spark配置