hive和spark-sql計算stddev的結果差異
阿新 • • 發佈:2019-01-11
問題描述:
利用spark-sql得到了NaN的值,核對發現這些值都是關於stddev計算後得到的,但是在hive中查得為0.0。
使用的SQL程式碼為
select phone , tour_ymd , stddev(total_price) as total_price_stddev , stddev(bedroom_cnt) as bedroom_cnt_stddev , stddev(tour_last_mintues) as tour_last_mintues_stddev , stddev(showing_last_3day_cnt) as showing_last_3day_cnt_stddev , stddev(showing_last_7day_cnt) as showing_last_7day_cnt_stddev , stddev(showing_last_15day_cnt) as showing_last_15day_cnt_stddev , stddev(showing_last_30day_cnt) as showing_last_30day_cnt_stddev , stddev(temp) as stddevtemp , stddev(humidity) as stddevhumidity , stddev(aqi) as stddevaqi from my_tb where my_condition group by phone, tour_ymd
問題原因:
雖然都執行的是一個SQL程式碼,但是從結果上看,hive中執行的時候是除以N(標準差)而spark-sql中執行時除以的是N-1(貝塞爾修正的標準差)關於方差標準差知識點
- 方差:描述資料集中資料點的離散程度;數學公式如下:
其中N的作用為將計算得到的累積偏差進行平均,從而消除資料集大小對計算資料離散程度所產生的影響。
- 標準差數學上定義為方差的平方根
方差和標準差都是對一組(一維)資料進行統計的,反映的是一維陣列的離散程度;與之相對應的是協方差,對兩組資料進行統計的,反映的是兩組資料之間的相關性。
- 使用標準差的優勢
與方差相比,使用標準差來表示資料點的離散程度有3個好處:
- 表示離散程度的數字與樣本資料點的數量級一致,更適合對資料樣本形成感性認知;
- 表示離散程度的數字單位與樣本資料及均值的單位一致,更方便做後續的分析運算;
- 在樣本資料大致符合正態分佈的情況下,標準差具有方便估算的特性:“3希格瑪原則”。
- 貝塞爾修正
除了上述方差的計算方式,還有一種計算方式,公式如下
使用N所計算得到的方差及標準差只能用來表示該資料集本身(population)的離散程度;如果資料集是某個更大的研究物件的樣本(sample),那麼在計算該研究物件的離散程度時,就需要對上述方差公式和標準差公式進行貝塞爾修正,將N替換為N-1。
即是除以 N 還是 除以 N-1,則要看樣本是否全:如果是抽樣,則除以N-1,如果是全部,則除以N。