在聚合操作中,需要指定鍵或分組方式,以及指定如何轉換一列或多列數據的聚合函數。s
除了處理任意類型的值之外,Spark還可以創建以下分組類型:
- 最簡單的分組通過在select語句中執行聚合來匯總整個DataFrame
- “group by”指定一個或者多個key也可以指定一個或者多個聚合函數,來對包括value的列執行行轉換操作。
- “window”指定一個或者多個key也可以指定一個或者多個聚合函數,來對包含value的列執行轉換操作。
- “grouping set”可用於在多個不同級別進行聚合。grouping set是SQL中的一個保留字,而在DataFrame中需要使用rollup和cube。
- “rollup”指定一個或多個key,也可以指定一個或多個聚合函數,來對包含value的列執行轉換操作,並會針對指定的多個key進行分級分組匯總。
- “cube”指定一個或多個key,也可以指定一個或多個聚合函數,來對包含value 的列執行轉換操作,並會針對指定的多個key進行全組合分組匯總。
注意:要獲得一個精確的結果,開銷會非常大。但是計算出一個近似的結果要相對容易的多。通常使用一些近似函數,會提高spark作業的效率
聚合函數
count函數
count函數是一個轉換操作而不是一個動作操作。
count可以執行以下2種操作:
- 對指定列進行計數
- 使用count(*)或count(1)對所有列進行計數
approx_count_distinct函數
功能與count_distinct一樣,但是統計的結果允許有誤差。這里approx_count_distinct的另一個參數就指定了可容忍的誤差的最大誤差。
sumDistinct函數
去重后,進行求sum
方差和標准差
注意:Spark既支持統計樣本的標准差,也支持統計總體的標准差。
skewness和kurtosis
偏度系數(skewness)和峰度系數(kurtosis)都是對數據集中的極端數據點的衡量指標。
偏度系數衡量數據相對於平均值的不對稱程度。
峰度系數衡量數據分布形態陡緩程度。
協方差和相關性
cov和corr,它們分別用於計算協方差和相關性。相關性采用Pearson相關系數來衡量,范圍是-1~+1。協方差的范圍由數據中的輸入決定。
注意:協方差又分為樣本協方差和總體協方差。
聚合輸出復雜類型
分組
分組操作的步驟:
- 指定要對其進行分組的一列或者多列。
- 指定一個或者多個聚合操作。
利用表達式分組
使用Map進行分組
Map是以鍵為列,值為要執行的字符串形式的聚合函數。
window函數
在指定數據“窗口”上執行聚合操作,並使用對當前數據的引用來定義它,此窗口指定將哪些行傳遞給此函數。
注意:group-by與窗口函數之間的區別:
在使用group-by處理數據時,每一行只能進入一個分組;窗口函數基於稱為框的一組行,計算表的每一輸入行的返回值。也就是說一行數據,在不同的框中屬於不用的組。
Spark支持三種窗口函數:排名函數、解析函數和聚合函數。
分組集
group-by表達式可以對一組列上的值進行聚合操作。
rollup
當我們設置分組的key為多個列時,Spark會分析這些列,並根據各列中存在的實際數值,確定列值組合作為分組的key。而rollup分組聚合是一種多維聚合操作,可以執行多種不同group-by風格的計算。
cube
cube分組聚合則更進一步,它不同於rollup的分級聚合,而是對所有參與的列值進行所有維度的全組合聚合。
對元數據進行分組
透視轉換
透視轉換可以根據列中的不同行創建多個列。
用戶自定義的聚合函數
用戶定義的聚合函數(UDAF)是用戶根據自定義公式或業務邏輯定義自己的聚合函數的一種方法。可以使用UDAF來計算輸入數據組的自定義計算。