當前位置:
首頁 >
spark计算操作整理
發布時間:2024/8/23
42
豆豆
生活随笔
收集整理的這篇文章主要介紹了
spark计算操作整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
spark 的計算流程大概如圖:
其中, 通過多次處理, 生成多個中間數據, 最后對結果進行操作獲得數據. 本文不涉及任何原理, 僅總結spark在處理的時候支持的所有操作, 方便后面使用的時候, 可以參照本文進行數據的處理.
以下函數整理, 基與Python中RDD對象.
數據的轉換操作
數據之間的轉換操作, 用于生成中間數據.
| 過濾 | |
| filter | 過濾掉函數計算后返回 false 的數據 |
| distinct | 對數據集中的元素進行去重. |
| 數據轉換 | |
| map | 一對一. 方法用于對數據進行轉換, 一個輸入轉換為一個輸出 |
| flatMap | 一對多. 方法對數據進行轉換, 一個輸入轉換為0或多個輸出, 所以回調返回一個序列 |
| mapPartitions | 多對多. 數據轉換批量. 方法對數據進行轉換, 每次接收一個任務分區的數據集合進行處理, 同時返回一個轉換后的數據序列. 作用類似map, 只是可以批量處理, 對優化性能有一定的幫助. |
| mapPartitionsWithIndex | 與mapPartitions方法類似, 不同的是此函數回調額外接收分區的序號. |
| flatMapValues | 一對多. 針對(K, V)數據集, 將一個 V 拆分為多個. |
| mapValues | 一對一. 針對(K, V)數據集. 將每個 value 進行轉換 |
| keyBy | 將數據集轉成(K, V), 為每個元素通過自定義函數生成一個 K |
| zipWithIndex | 將數據轉為(K, V)數據集. K 是元素, V 是索引 |
| keys | 針對 (K, V)數據集, 取所有的 key |
| values | 針對(K, V)數據集, 取所有的 value |
| 相同 key 合并(K, V)數據 | |
| reduceByKey | 多個 V 轉換為一個, 類型不變. 將相同 key 的 value 通過自定義函數合成, 返回一個新的 (K, V) 數據集, 此時所有的相同 key 已經合并在一起了. |
| foldByKey | 多個 V 轉換為一個, 類型不變, 可設初始值 將相同 key 的 value, 通過自定義函數合并為一個. 與reduceByKey的區別是, 此函數可以設置一個初始值 |
| aggregateByKey | 多個 V 轉換為一個, 類型可變, 可設初始值. 針對(K, V)數據集, 將相同 key 的元素聚合為一個. 合并前后的數據類型可以不一樣. 其接收三個參數: zeroValue: 自定義信息的初始狀態 seqOp: 對元素分區中的每個元素進行處理. 參數為: 每次方法的返回(初始為: zeroValue), 本次元素 combOp: 對每個分區的結果進行合并. 參數為: 每次方法的返回(初始為: zeroValue), 本次元素(seqOp 返回) |
| combineByKey | 多個 V 組合為一個, 類型改變. 針對(K, V)數據集, 將相同 key 元素進行聚合. 轉換為一個 (K, C)的數據集. 其接收回調來生成 C 類型 createCombiner: 將類型 V 轉為類型 C. mergeValue: 將 V 和 C 進行合并. mergeCombiners: 將兩個 C 進行合并 |
| 分組 | |
| groupBy | 自定義函數進行分組. 函數對每個元素進行計算, 結果相同的值被分到一組, 返回 (K, V[]) |
| groupByKey | 根據數據的 key 進行編組. 在一個 (K, V) 的數據集上, 返回 (K, V[]) 的結果. |
| 排序 | |
| sortBy | 根據自定義函數進行排序 |
| sortByKey | 針對(K, V) 數據集, 根據 key 進行排序, 可自定義排序函數 此函數通過sortBy也可以實現相同功能, 不過對于 (K, V), 此函數方便一些 |
| 隨機采樣 | |
| sample | 方法對數據集進行隨機采樣, 其接收參數: 1. 是否可重復 2. 每個元素被選中的期望次數(0-1) 3. 隨機數種子 |
| sampleByKey | 針對(K, V)數據集, 可指定多個 K 的每個隨機頻率, 按照頻率返回指定 K 的取樣數據 |
| randomSplit | 將一個 rdd 隨機分為多個 rdd |
| 數據合并 | |
| union | 將兩個數據集合并為一個數據集, 用于后續處理. |
| cartesian | 對兩個數據集做笛卡爾積. 比如: 數據1內容: [1, 2] 數據2內容: [3, 4] 結果內容: (1, 3), (1, 4), (2, 3), (2, 4) |
| join | 針對 (K, V) 數據集之間的合并. 兩個數據集: (K, V1), (K, V2). 合并后的數據集: (K, (V1, V2)) |
| cogroup, groupWith | 針對 (K, V)數據集的合并. 兩個函數作用相同 數據集1內容: (K1, V1), (K2, V2), (K1, V3) 數據集2內容: (K1, V4) 合并后的內容: (K1, ([V1, V3], [V4] ) ), (K2, ([V2], []) ) |
| fullOuterJoin | 針對(K, V)數據集. 返回合并后的元素序列, 若其中一個數據集沒有, 用 None 占位 數據集1內容: (K1, V1) 數據集2內容: (K1, V2), (K2, V3) 結果: (K1, (V1, V2)), (K2, (None, V3)) |
| leftOuterJoin | 針對(K, V)數據集, 執行左側外連接. 與fullOuterJoin 的區別是, 若 K 在第一個數據集不存在, 則不返回 |
| rightOuterJoin | 針對 (K, V)數據集, 執行右側外鏈接 |
| intersection | 取兩個數據集的交集 |
| subtract | 取數據集的差集, 元素在數據1中, 不在數據2中. |
| subtractByKey | 取數據差集, 針對 (K, V)數據. K 在數據1中, 不再數據2中 |
| zip | 將兩個數據集合并為(K, V)數據集, 兩數據集元素數量必須一致 |
| 分區操作 | |
| coalesce | 將 RDD 縮減到 n 個分區, 可指定是否亂序 |
| repartition | 將 RDD 修改到 n 個分區, 亂序 |
| repartitionAndSortWithinPartitions | 將 RDD 修改為 n 個分區, 并在每個分區根據 key 進行排序. 可自定義分區函數與排序函數 |
| glom | 將每個分區的元素合并為一個列表 |
結果的獲取操作
用于從已經處理過的數據集中取出結果.
| 數據合并 | |
| reduce | 通過自定義函數, 將數據集中所有元素合并為一個元素返回. |
| fold | 將所有元素合并為一個. 與reduce的區別是, 這個函數有個初始值 |
| aggregate | 將所有元素合并為一個元素. 在合并過程中可以攜帶自定義信息. 合并前后的數據類型可以不一樣. 參數見: aggregateByKey |
| 獲取結果 | |
| collect | 將結果中的數據作為數組返回. 通過通過前面處理后, 只剩下很小的數據才會這么做. |
| collectAsMap | 針對(K, V)數據集. 將其作為 map 返回 |
| first | 獲取結果中的第一個元素. |
| take | 獲取結果的前 n 個元素. |
| takeSample | 返回結果的 n 個元素, 采樣獲取. |
| takeOrdered | 獲取結果的前 n 個元素, 會先根據自定義函數對結果進行排序. 內存排序 |
| froeach | 遍歷結果 |
| foreachPartition | 遍歷結果分區, 每次接收一批數據 |
| lookup | 針對(K, V)數據集. 找到所有指定 K 的元素返回 |
| 統計結果 | |
| count | 獲取結果元素個數. |
| countByValue | 統計結果中每一個元素的個數. 返回結果如: (V, 2) |
| countByKey | 對(K, V)數據集. 統計每一個 key 的數量, 返回結果如: (K, 2) |
| countApproxDistinct | 統計數據集中去重的元素個數, 根據精度不同, 其準確度不一定, 此方法返回的是一個大致的值. |
| max | 結果中的最大值, 可自定義比較函數 |
| min | 結果的最小值. 可自定義比較函數 |
| sum | 求和 |
| mean | 結果的平均值 |
| stdev | 元素的標準差 |
| variance | 計算方差 |
| sampleStdev | 結果元素的樣本標準差 (除以 n-1那個) |
| sampleVariance | 計算元素的樣本方差 (除以 n-1那個) |
| 保存結果 | |
| saveAsTextFile | 將結果輸出到指定文件. 對結果中的每個元素調用 toString 方法, 保存為一行數據. |
| 等等吧, 都是 saveAs 打頭的方法 |
比如Spark SQL等還有一些自己實現的方法來方便使用的, 沒有在此列出. 留著后面寫的時候作為參考, 畢竟英語是硬傷.
總結
以上是生活随笔為你收集整理的spark计算操作整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gale-Shapley算法
- 下一篇: 2019Mobicom 论文列表