1. 程式人生 > >hive 分位數函數 percentile(col, p)

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

clear dsm atom core xmlns exp bsp csdn cast

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}]

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