spark中四個ByKey運算元的區別

2021-10-08 18:22:12 字數 2194 閱讀 9275

我們今天又來分析運算元的具體實現了,如果只是知道乙個方法的是幹什麼的,對於作用比較相似的方法我們很難分辨應該具體用什麼,所以懂了具體的原理,我們就知道在具體業務場景下應用哪個方法更好

reducebykey:

引數:func, [numtasks]
作用:在乙個(k,v)的rdd上呼叫,返回乙個(k,v)的rdd,使用指定的reduce函式,將相同key的值聚合到一起,reduce任務的個數可以通過第二個可選的引數來設定

aggregatebykey:

引數:(zerovalue:u,

[partitioner: partitioner]

)(seqop:

(u, v)

=> u,combop:

(u, u)

=> u)

作用:在kv對的rdd中,,按key將value進行分組合併,合併時,將每個key的第乙個value和初始值作為seq函式的引數,進行計算,返回的結果作為乙個新的kv對,然後再將結果按照key進行合併,最後將每個分組的value傳遞給combine函式進行計算(先將前兩個value進行計算,將返回結果和下乙個value傳給combine函式,以此類推),將key與計算結果作為乙個新的kv對輸出

foldbykey:

引數:(zerovalue: v)

(func:

(v, v)

=> v)

: rdd[

(k, v)

]

作用:aggregatebykey的簡化操作,seqop和combop相同

combinebykey:

引數:(createcombiner: v => c,  mergevalue:

(c, v)

=> c, mergecombiners:

(c, c)

=> c)

我們追蹤這四個方法的原始碼發現最後都是呼叫的同乙個方法

這三個引數的意思是:

(1)createcombiner: 表示的是將相同key第一次出現的value的轉換操作

(2)mergevalue: 分區內資料的計算規則

(3)mergecombiners: 分區間資料的計算規則

我們依次追蹤四個方法到距離這個方法最近的原始碼內部:

我們看到reducebykey方法呼叫這個方法沒對value值進行任何操作,並且分區內和分區間的計算規則都是呼叫的我們傳入的那個計算規則

我們看到將我們傳入的第乙個引數進行乙個序列化等包裝操作,將分區內的計算規則進行了包裝,我們也能看到會將我們傳入的初始值用分區內的計算規則先進行一次操作

我們看到和aggregatebykey是一樣的,只是分區內計算規則和分區間的計算規則都是呼叫的一樣的而已

最後我們總結一下:

reducebykey:是不改變value值,分區內計算規則和分區間計算規則一樣

aggregatebykey:是需要有乙個初始值,將初始值用分區內計算規則操作一遍,之後再做分區內計算,再做分區間計算

foldbykey:是簡化的aggregatebykey,分區內計算規則和分區間計算規則一樣

combinebykey:是需要將value的結構改變之後,再進行分區內計算,最後進行分區間計算

JSP中四個域

再解析這個四個域之前,不得不談一下伺服器的原理,我在 web伺服器那篇筆記當中沒有系統的說一下伺服器的作用 參考j2ee書本 73頁內容 伺服器要為乙個請求單獨開啟乙個執行緒。通過io流來獲取和返回資料。還要解析使用者請求,生成響應資料。jsp中是通過servlet jspservice 方法完成解...

hive中的四個by

全域性排序,只有乙個reduce 對每乙個reducer內部的資料進行排序,全域性結果集來說不是排序的,即只能保證每乙個reduce輸出的檔案中的資料是按照規定的字段進行排序的 insert overwrite local directory select from table name sort ...

Hive DML中的四個by

使用 order by字句排序 asc是公升序也是預設的,desc是降序實操案例 查詢員工按照工資降序排列select from emp order by sal desc 按照部門和工資公升序排序select from emp order by deptno,sal select from emp...