Hive - 如何获取每组值的分位数

Posted

技术标签:

【中文标题】Hive - 如何获取每组值的分位数【英文标题】:Hive - how to get the quantile on values per group 【发布时间】:2015-10-01 09:40:15 【问题描述】:

如何为同一项目的每组行计算一个值的分位数(ntile 或百分位数)?

我想知道项目“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

错误信息:

编译语句时出错:FAILED ParseException line 8:0 在项目附近的“位置”缺少 EOF

我可以在 R 中使用如下命令:

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

但出于性能原因,我需要在 Hadoop 中使用它。

【问题讨论】:

【参考方案1】:

在 Hive 中使用 Percentile 函数我们可以找到分位数。

以下查询用于查找每个项目的第 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;

【讨论】:

如何使用上述 UDF 计算十分位数?【参考方案2】:

“哪里”应该在“分组依据”之前

【讨论】:

以上是关于Hive - 如何获取每组值的分位数的主要内容,如果未能解决你的问题,请参考以下文章

每组值的自定义序列/自动增量

每组值的自定义序列/自动增量

使用 SciPy 的分位数-分位数图

如何使用 Spark 对象获取 Hive 表的位置值?

为每组值创建 Div

js方法中已经获取到了文本框的值,当这个值的小数位数大于8时提示只能保留6位小数,怎么做?