(一)RDD的處理過程
? RDD經過一系列的“轉換”操作,每一次轉換都會產生不同的RDD,以供給下一次“轉換”操作使? ? ? ? 用,直到最后一個RDD經過“行動”操作才會真正被計算處理。
1.延遲。RDD中所有的轉換都是延遲的,它們并不會直接計算結果。相反,他們只是記住這些應用 ???到基礎數據集上的轉換動作。只有當發生要求返回結果給driver的動作時,這些轉換才會真正運? ? ?行。
2.血緣關系。一個RDD運算之后,會產生新的RDD。
(二)轉換算子
轉換算子用于對 RDD 進行轉換操作,生成一個新的 RDD。轉換操作是惰性的,即當調用轉換算子時,Spark 并不會立即執行計算,而是記錄下操作步驟,直到遇到行動算子時才會觸發實際的計算。
從格式和用法上來看,它就是集合對象的方法。
以下是一些常見的轉換算子:
????????1.map 算子
作用:對 RDD 中的每個元素應用給定的函數 f,將每個元素轉換為另一個元素,最終返回一個新的 RDD。這個函數 f 接收一個輸入類型為 T 的元素,返回一個類型為 U 的元素。
????????2.filter 算子
作用:篩選出 RDD 中滿足函數 f 條件(即 f 函數返回 true)的元素,返回一個新的 RDD,新 RDD 中的元素類型與原 RDD 相同。
格式:def filter(f: T => Boolean): RDD[T]
????????3.flatMap算子
作用:對 RDD 中的每個元素應用函數 f,函數 f 返回一個可遍歷的集合,然后將這些集合中的元素扁平化合并成一個新的 RDD。
格式:def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]
4.reduceByKey 算子
reduceByKey 是 Spark 中用于處理鍵值對(Key - Value)類型 RDD 的一個重要轉換算子。它的核心作用是對具有相同鍵的所有值進行聚合操作,通過用戶提供的聚合函數將這些值合并成一個結果,從而實現數據的歸約和統計。例如統計每個鍵出現的次數、計算每個鍵對應值的總和、平均值等。
格式:def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)]
(三)行動算子
行動算子(Action) 是一種觸發 RDD 計算的操作。與轉換算子(Transformation)不同,行動算子會返回一個結果給驅動程序(Driver Program),或者將結果寫入外部存儲系統。行動算子是觸發 Spark 計算的“觸發點”,因為 Spark 的 RDD 是懶惰計算的,只有在執行行動算子時,才會真正開始計算。
下面介紹集中常見的行動算子。
????????1. collect算子
作用:用于將分布式存儲在集群中各個節點上的 RDD 元素收集到驅動程序(Driver Program)中,并以數組的形式返回。這意味著該算子會觸發 Spark 作業的執行,將之前的轉換操作進行實際計算,并將結果匯總到驅動程序所在的節點。
格式:def collect(): Array[T]
????????2.reduce算子
作用:reduce 用于對 RDD 中的元素進行全局聚合操作,例如計算 RDD 中所有元素的總和、最大值、最小值等。在分布式計算環境中,reduce 會先在每個分區內進行局部聚合,然后將各個分區的結果進行全局聚合,最終得到一個單一的結果。
格式:def reduce(func: (T, T) => T): T
????????3.count算子
作用:count 是 Spark 中的一個行動算子,用于統計 RDD 中元素的數量。它會觸發 Spark 作業的實際執行,對 RDD 中的所有元素進行計數,并將最終的計數結果返回給驅動程序。例如在進行數據驗證、抽樣或者評估數據處理任務的復雜度時,都可能需要知道 RDD 中元素的數量
格式:def count(): Long
????????4.foreach算子
作用:foreach 用于對 RDD 中的每個元素應用指定的函數。它主要用于執行一些副作用操作,比如將數據寫入外部存儲系統(如數據庫、文件系統等),或者進行日志記錄等。與其他轉換算子不同,foreach 不會返回一個新的 RDD,而是直接對每個元素執行操作。
格式:def foreach(f: T => Unit): Unit