2015-10-01 38 views
2

如何計算同一項目的每組行的分位數(百分位數或百分位數)?Hive - 如何獲得每組數值的分位數

我想知道項目'101',只考慮'p'爲1的行,例如需要在前25%的值。

create table t1 
(item INT, 
p INT, 
value FLOAT 
); 

insert into t1 values ('101', '1', '.5'); 
insert into t1 values ('101', '2', '.4'); 
insert into t1 values ('101', '1', '.6'); 
insert into t1 values ('101', '2', '.2'); 
insert into t1 values ('101', '1', '.7'); 
insert into t1 values ('101', '2', '.3'); 
insert into t1 values ('102', '1', '1.5'); 
insert into t1 values ('102', '2', '1.4'); 
insert into t1 values ('102', '1', '1.6'); 
insert into t1 values ('102', '2', '1.2'); 
insert into t1 values ('102', '1', '1.7'); 
insert into t1 values ('102', '2', '1.3'); 

我已經嘗試了以下,但得到一個錯誤。

SELECT 
    item, 
    p, 
    value, 
NTILE(4) OVER (ORDER BY value DESC) AS quartile 
FROM t1 
group by item 
where p=1 

錯誤消息:

錯誤在編譯時聲明:失敗ParseException的行8:0 缺少EOF在 '位置' 附近的項目

我能做到這一點的R,與一個命令如:

d[p==1, quantile(value, .75, na.rm=TRUE), by=item] 

但我需要在Hadoo由於性能原因。

回答

5

在使用百分位函數的Hive中,我們可以找到分位數值。

以下查詢用於查找每個項目的第25,第50和第75百分點值。

select item,p,percentile_approx(value,array(0.25,0.50.0.75)) 
from t1 where p=1 group by item,p; 

以下查詢用於查找每個項目的給定百分位數值。

select item,p,percentile_approx(value,0.5) 
from t1 where p=1 group by item,p; 
+0

我該如何計算使用上述UDF的十分位數? –