Spark-Core編程(二)
RDD轉換算子
RDD 根據數據處理方式的不同將算子整體上分為 Value 類型、雙 Value 類型和 Key-Value 類型
Value類型
1)map
將處理的數據逐條進行映射轉換,這里的轉換可以是類型的轉換,也可以是值的轉換
實例:
運行結果:
2)mapPartitions
將待處理的數據以分區為單位發送到計算節點進行處理,這里的處理是指可以進行任意的處理,哪怕是過濾數據
實例:
運行結果:
map和mapPartitions 的區別
1.Map 算子是分區內一個數據一個數據的執行,類似于串行操作。而 mapPartitions 算子是以分區為單位進行批處理操作
2.Map 算子主要目的將數據源中的數據進行轉換和改變。但是不會減少或增多數據。MapPartitions 算子需要傳遞一個迭代器,返回一個迭代器,沒有要求的元素的個數保持不變,所以可以增加或減少數據
3.Map 算子因為類似于串行操作,所以性能比較低,而是 mapPartitions 算子類似于批處理,所以性能較高。但是?mapPartitions 算子會長時間占用內存,那么這樣會導致內存可能不夠用,出現內存溢出的錯誤。所以在內存有限的情況下,不推薦使用
3)mapPartitionsWithIndex
將待處理的數據以分區為單位發送到計算節點進行處理,這里的處理是指可以進行任意的處理,哪怕是過濾數據,在處理時同時可以獲取當前分區索引
4)flatMap
將處理的數據進行扁平化后再進行映射處理,所以算子也稱之為扁平映射
實例:
運行結果:
map和flatMap的區別:
map會將每一條輸入數據映射為一個新對象
flatMap包含兩個操作:會將每一個輸入對象輸入映射為一個新集合,然后把這些新集合連成一個大集合
5)glom
將同一個分區的數據直接轉換為相同類型的內存數組進行處理,分區不變
實例:
運行結果:
6)groupBy
將數據根據指定的規則進行分組, 分區默認不變,但是數據會被打亂重新組合,我們將這樣的操作稱之為?shuffle。極限情況下,數據可能被分在同一個分區中
實例:
運行結果:
注:一個組的數據在一個分區中,但是并不是說一個分區中只有一個組
7)filter
將數據根據指定的規則進行篩選過濾,符合規則的數據保留,不符合規則的數據丟棄。
當數據進行篩選過濾后,分區不變,但是分區內的數據可能不均衡,生產環境下,可能會出
現數據傾斜
實例:
運行結果:
8)sample
根據指定的規則從數據集中抽取數據
實例
1.伯努利算法(抽取數據不放回)
2.泊松算法(抽取數據放回)
運行結果:
9)distinct
將數據集中重復的數據去重
實例:
運行結果:
10)coalesce
根據數據量縮減分區,用于大數據集過濾后,提高小數據集的執行效率
當?spark 程序中,存在過多的小任務的時候,可以通過 coalesce 方法,收縮合并分區,減少分區的個數,減小任務調度成本
實例:
運行結果:
11)repartition
該操作內部其實執行的是?coalesce 操作,參數 shuffle 的默認值為 true。無論是將分區數多的RDD 轉換為分區數少的 RDD,還是將分區數少的 RDD 轉換為分區數多的 RDD,repartition操作都可以完成,因為無論如何都會經?shuffle 過程
實例:
運行結果:
12sortBy
該操作用于排序數據。在排序之前,可以將數據通過?f 函數進行處理,之后按照 f 函數處理的結果進行排序,默認為升序排列。排序后新產生的?RDD 的分區數與原 RDD 的分區數一致。中間存在?shuffle 的過程
實例:
運行結果:
雙Value類型
13) intersection
對源?RDD 和參數 RDD 求交集后返回一個新的 RDD
實例:
運行結果:
14) union
對源?RDD 和參數 RDD 求并集后返回一個新的 RDD(重復數據不會去重)
實例
運行結果:
15) subtract
以源?RDD 元素為主,去除兩個 RDD 中重復元素,將源RDD的其他元素保留下來。(求差集)
實例:
運行結果:
16) zip
將兩個?RDD 中的元素,以鍵值對的形式進行合并。其中,鍵值對中的 Key 為第 1 個 RDD
中的元素,Value 為第 2 個 RDD 中的相同位置的元素
實例:
運行結果:
Key-Value類型:
17) partitionBy
將數據按照指定?Partitioner 重新進行分區。Spark 默認的分區器是 HashPartitioner
實例:
運行結果:
18) groupByKey
將數據源的數據根據?key 對 value 進行分組
實例:
運行結果:
19) reduceByKey
可以將數據按照相同的?Key 對 Value 進行聚合
實例:
運行結果:
20) aggregateByKey
將數據根據不同的規則進行分區內計算和分區間計算
實例:
運行結果:
21) foldByKey
當分區內計算規則和分區間計算規則相同時,aggregateByKey 就可以簡化為 foldByKey
實例
運行結果:
22) combineByKey
最通用的對?key-value 型 rdd 進行聚集操作的聚集函數(aggregation function)。類似于
aggregate(),combineByKey()允許用戶返回值的類型與輸入不一致
實例:
運行結果:
23) sortByKey
在一個(K,V)的 RDD 上調用,K 必須實現 Ordered 接口(特質),返回一個按照 key 進行排序
實例
運行結果: