參考鏈接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,p3…p1,p2,p3…),即
如果不放心的話,就給col再加個轉換:
其輸出結果長這樣:
沒法直接用啊!再加個轉換:
輸出結果就長這樣了:
percentile |
---|
0 |
4001 |
4061 |
實際操作中,發現有時在計算分位數的時候mapper會卡在0%。
前面說過,如果distinct的值小於B,就會返回精確值,那么個人猜測是因為后台執行的過程是先做了一個select distinct limit B,然后排序得到分位數。如果distinct值特別多的情況下,僅僅是去重就是一個巨大的運算負擔,更別說排序了。而當把B從10000調到100的時候很快就能跑出來了