Hive計算分位數


參考鏈接1:https://blog.csdn.net/sinat_27339001/article/details/52189843

參考鏈接2:https://blog.csdn.net/haramshen/article/details/52668586

hive里面倒是有個percentile函數和percentile_approx函數,其使用方式為percentile(col, p)、percentile_approx(col, p),p(0,1)p∈(0,1) 
其中percentile要求輸入的字段必須是int類型的,而percentile_approx則是數值類似型的都可以 
其實percentile_approx還有一個參數B:percentile_approx(col, p,B),參數B控制內存消耗的近似精度,B越大,結果的准確度越高。默認為10,000。當col字段中的distinct值的個數小於B時,結果為准確的百分位數。 
如果我要求多個分位數怎么辦呢?,可以把p換為array(p1,p2,p3p1,p2,p3…),即

 
percentile_approx(col,array(0.05,0.5,0.95),9999)percentile_approx(col,array(0.05,0.5,0.95),9999)


如果不放心的話,就給col再加個轉換: 

 
percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)


其輸出結果長這樣:

 
[0.0,4001.0,4061.0][0.0,4001.0,4061.0]


沒法直接用啊!再加個轉換:

 
explode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentileexplode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentile


輸出結果就長這樣了:

 

percentile
0
4001
4061

實際操作中,發現有時在計算分位數的時候mapper會卡在0%。 
前面說過,如果distinct的值小於B,就會返回精確值,那么個人猜測是因為后台執行的過程是先做了一個select distinct limit B,然后排序得到分位數。如果distinct值特別多的情況下,僅僅是去重就是一個巨大的運算負擔,更別說排序了。而當把B從10000調到100的時候很快就能跑出來了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM