1. 程式人生 > >如何解決hive同時計算多個分位數的問題

如何解決hive同時計算多個分位數的問題

眾所周知,原生hive沒有計算中位數的函式(有的平臺會有),只有計算分位數的函式percentile

在資料量不大的時候,速度尚可。但是資料量一上來之後,完全計算不出來。

那麼如何解決這個問題呢,我們可以使用 row_number() over()通過兩次排序來解決同時計算多個分位數,速度飛快。

比如我們需要計算mkt_mcc_storeidx表下以mkt_label,mccgroup,month分組,value_mccgroup的分位數

第一步:利用row_number() over()給value_mccgroup在分組裡排序,記錄下排名


第二步:計算mkt_label,mccgroup,month分組下的資料總數


第三步:join前兩步的結果,取rank=你需要計算的分位數位置,想計算多少個分位數就計算多少個


第四步:再排一次序,這次資料量就已經少了很多了,畢竟每組裡面只有幾個資料,記錄排名


第五步:得到具體的分位數


第六步:行轉成列,所有分位數計算完畢


後來查看了下SQL程式碼的執行樹,發現percentile利用了map來存資料,怪不得這麼耗記憶體,其實時間久並不是算的時間久,是因為記憶體不夠了,系統一直在回收記憶體


而rank over 僅僅就是個排序而已