Spark算子分類詳解

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

0 算子常見分類

從大方向來說,Spark算子大致可以分爲以下兩類:

  1. Transformation變換/轉換算子:這種變換並不觸發提交作業,完成作業中間過程處理。
  • Transformation 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action 操作的時候纔會真正觸發運算。
  1. Action 行動算子:這類算子會觸發 SparkContext 提交 Job 作業。
  • Action 算子會觸發 Spark 提交作業(Job),並將數據輸出 Spark系統。

從小方向來說,Spark 算子大致可以分爲以下三類:

  1. Value數據類型的Transformation算子,這種變換並不觸發提交作業,針對處理的數據項是Value型的數據。

  2. Key-Value數據類型的Transfromation算子,這種變換並不觸發提交作業,針對處理的數據項是Key-Value型的數據對。

  3. Action算子,這類算子會觸發SparkContext提交Job作業。

1 Transformation函數和Action函數

Transformation函數

Transformation函數 描述 類型
map 將原來 RDD 的每個數據項通過 map 中的用戶自定義函數f映射轉變爲一個新的元素。源碼中map算子相當於初始化一個RDD, 新RDD叫做MappedRDD(this, sc.clean(f))。 Value數據類型,輸入分區與輸出分區一對一型
flatMap 將原來 RDD 中的每個元素通過函數f轉換爲新的元素,並將生成的RDD的每個集合中的元素合併爲一個集合,內部創建FlatMappedRDD(this,sc.clean(f))。 Value數據類型,輸入分區與輸出分區一對一型
mapPartitions 獲取到每個分區的迭代器,在函數中通過這個分區整體的迭代器對整個分區的元素進行操作。 內部實現是生成MapPartitionsRDD。 Value數據類型,輸入分區與輸出分區一對一型
glom glom函數將每個分區形成一個數組,內部實現是返回的GlommedRDD。 Value數據類型,輸入分區與輸出分區一對一型
union 使用 union 函數時需要保證兩個RDD元素的數據類型相同,返回的RDD數據類型和被合併的RDD元素數據類型相同,並不進行去重操作,保存所有元素。 Value數據類型,輸入分區與輸出分區多對一型
cartesian 對兩個RDD內的所有元素進行笛卡爾積操作。操作後,內部實現返回CartesianRDD。 Value數據類型,輸入分區與輸出分區多對一型
grouBy 將元素通過函數生成相應的 Key,數據就轉化爲Key-Value格式,之後將Key相同的元素分爲一組。 Value數據類型,輸入分區與輸出分區多對多型
filter 對元素進行過濾,對每個元素應用f函 數,返回值爲true的元素在RDD中保留,返回值爲false的元素將被過濾掉。內部實現相當於生成FilteredRDD(this,sc.clean(f))。 Value數據類型,輸出分區爲輸入分區子集型
distinct 將RDD中的元素進行去重操作。圖9中的每個方框代表一個RDD分區,通過distinct函數,將數據去重。 Value數據類型,輸出分區爲輸入分區子集型
subtract subtract相當於進行集合的差操作,RDD 1去除RDD 1和RDD 2交集中的所有元素。 Value數據類型,輸出分區爲輸入分區子集型
sample sample 將 RDD 這個集合內的元素進行採樣,獲取所有元素的子集。用戶可以設定是否有放回的抽樣、百分比、隨機種子,進而決定採樣方式。內部實現是生成SampledRDD(withReplacement, fraction, seed)。 Value數據類型,輸出分區爲輸入分區子集型
takeSample takeSample()函數和上面的sample函數是一個原理,但是不使用相對比例採樣,而是按設定的採樣個數進行採樣,同時返回結果不再是RDD,而是相當於對採樣後的數據進行Collect(),返回結果的集合爲單機的數組。 Value數據類型,輸出分區爲輸入分區子集型
cache cache 將 RDD 元素從磁盤緩存到內存。 相當於 persist(MEMORY_ONLY) 函數的功能。 Value數據類型,Cache型
persist persist 函數對 RDD 進行緩存操作。數據緩存在哪裏依據 StorageLevel 這個枚舉類型進行確定。 Value數據類型,Cache型
mapValues 針對(Key, Value)型數據中的 Value 進行 Map 操作,而不對 Key 進行處理。 Key-Value數據類型,輸入分區與輸出分區一對一
combineByKey 只是兩個值合併成一個值。 Key-Value數據類型,單個RDD聚集
reduceByKey reduceByKey 是比 combineByKey 更簡單的一種情況,只是兩個值合併成一個值,( Int, Int V)to (Int, Int C),比如疊加。 Key-Value數據類型,單個RDD聚集
partitionBy 對RDD進行分區操作。 Key-Value數據類型,單個RDD聚集
Cogroup 將兩個RDD進行協同劃分。 Key-Value數據類型,兩個RDD聚集
join 對兩個需要連接的 RDD 進行 cogroup函數操作,將相同 key 的數據能夠放到一個分區,在 cogroup 操作之後形成的新 RDD 對每個key 下的元素進行笛卡爾積的操作,返回的結果再展平,對應 key 下的所有元組形成一個集合。最後返回 RDD[(K, (V, W))]。 Key-Value數據類型,連接
leftOutJoin和rightOutJoin LeftOutJoin(左外連接)和RightOutJoin(右外連接)相當於在join的基礎上先判斷一側的RDD元素是否爲空,如果爲空,則填充爲空。 如果不爲空,則將數據進行連接運算,並返回結果。 Key-Value數據類型,連接

Action函數

Action函數 描述 類型
foreach 對 RDD 中的每個元素都應用 f 函數操作,不返回 RDD 和 Array, 而是返回Uint。 無輸出
saveAsTextFile 將數據輸出,存儲到 HDFS 的指定目錄。 HDFS
saveAsObjectFile 將分區中的每10個元素組成一個Array,然後將這個Array序列化,映射爲(Null,BytesWritable(Y))的元素,寫入HDFS爲SequenceFile的格式。 HDFS
collect collect 相當於 toArray, toArray 已經過時不推薦使用, collect 將分佈式的 RDD 返回爲一個單機的 scala Array 數組。在這個數組上運用 scala 的函數式操作。 Scala集合和數據類型
collectAsMap 對(K,V)型的RDD數據返回一個單機HashMap。 對於重複K的RDD元素,後面的元素覆蓋前面的元素。 Scala集合和數據類型
reduceByKeyLocally 先reduce再collectAsMap的功能,先對RDD的整體進行reduce操作,然後再收集所有結果返回爲一個HashMap。 Scala集合和數據類型
lookup 對(Key,Value)型的RDD操作,返回指定Key對應的元素形成的Seq。 Scala集合和數據類型
count 返回整個 RDD 的元素個數。 Scala集合和數據類型
top 返回最大的k個元素。 Scala集合和數據類型
reduce reduce函數相當於對RDD中的元素進行reduceLeft函數的操作。 Scala集合和數據類型
fold fold和reduce的原理相同,但是與reduce不同,相當於每個reduce時,迭代器取的第一個元素是zeroValue。 Scala集合和數據類型
aggregate 先對每個分區的所有元素進行aggregate操作,再對分區的結果進行fold操作。 Scala集合和數據類型

引用:https://blog.csdn.net/dream0352/article/details/62229977


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章