hive 分位數函數 percentile(col, p)


注意在偶數情況下,中位數會存在小數,特別注意!

 

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的時候很快就能跑出來了.

轉自:https://blog.csdn.net/sinat_27339001/article/details/52189843

-------------------------------------------------------

中位數函數: percentile
語法: percentile(BIGINT col, p) 
返回值: double
說明: 求准確的第pth個百分位數,p必須介於0和1之間,但是col字段目前只支持整數,不支持浮點數類型
舉例:

 


中位數函數: percentile
語法: percentile(BIGINT col, array(p1 [, p2]…)) 
返回值: array<double>
說明: 功能和上述類似,之后后面可以輸入多個百分位數,返回類型也為array<double>,其中為對應的百分位數。
舉例:
select percentile(score,<0.2,0.4>) from udftest; 取0.2,0.4位置的數據

 


近似中位數函數: percentile_approx
語法: percentile_approx(DOUBLE col, p [, B]) 
返回值: double
說明: 求近似的第pth個百分位數,p必須介於0和1之間,返回類型為double,但是col字段支持浮點類型。參數B控制內存消耗的近似精度,B越大,結果的准確度越高。默認為10,000。當col字段中的distinct值的個數小於B時,結果為准確的百分位數
舉例:

 


近似中位數函數: percentile_approx
語法: percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) 
返回值: array<double>
說明: 功能和上述類似,之后后面可以輸入多個百分位數,返回類型也為array<double>,其中為對應的百分位數。
舉例:

 


直方圖: histogram_numeric
語法: histogram_numeric(col, b) 
返回值: array<struct {‘x’,'y’}>
說明: 以b為基准計算col的直方圖信息。
舉例:
hive> select histogram_numeric(100,5) from dual;
[{"x":100.0,"y":1.0}]

 

示例:中位數、平均數計算方法:

select
	avg(t1.price) as avg_price,
        percentile(int(price), 0.5) as mid_price
from 
        dev.devXXXXX
group by
        cate_id,
        cate_name;

  


免責聲明!

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



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