1. 程式人生 > >hive和spark-sql計算stddev的結果差異

hive和spark-sql計算stddev的結果差異

問題描述:

利用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個好處:
  1. 表示離散程度的數字與樣本資料點的數量級一致,更適合對資料樣本形成感性認知;
  2. 表示離散程度的數字單位與樣本資料及均值的單位一致,更方便做後續的分析運算;
  3. 在樣本資料大致符合正態分佈的情況下,標準差具有方便估算的特性:“3希格瑪原則”。
  • 貝塞爾修正
除了上述方差的計算方式,還有一種計算方式,公式如下
使用N所計算得到的方差及標準差只能用來表示該資料集本身(population)的離散程度;如果資料集是某個更大的研究物件的樣本(sample),那麼在計算該研究物件的離散程度時,就需要對上述方差公式和標準差公式進行貝塞爾修正,將N替換為N-1。
即是除以 N 還是 除以 N-1,則要看樣本是否全:如果是抽樣,則除以N-1,如果是全部,則除以N。