首页 > 解决方案 > Hive 百分位组由两个变量组成

问题描述

我有一个 Hive 表,我想在其中查找某个位置/工作日的值的第 10 个百分位数、中位数和第 90 个百分位数。下表的模型如下。如何编写查询,以便输出表列是 MyValue 的位置、工作日、第 10 个百分位、中位数和第 90 个百分位?(假设实际表有很多不同的位置和每个位置/工作日组合的多个条目)

我努力了:

create table myschema.my_output_table as
select location, weekday,
percentile(MyValue,0.1) over location,weekday as Weekday10pctile
from myschema.my_input_table

样本数据:

Location      Weekday       MyValue
Location_A    Monday        2.844958857
Location_A    Monday        1.22455235
Location_A    Monday        2.415189236
Location_A    Monday        2.162431558
Location_A    Tuesday       2.200264375
Location_A    Tuesday       1.218341845
Location_A    Tuesday       1.668882003
Location_A    Tuesday       0.077343061
Location_A    Wednesday     2.977162672
Location_A    Wednesday     2.059018125
Location_A    Wednesday     2.309147998
Location_A    Wednesday     1.241566476

标签: hivehiveql

解决方案


使用percentile_approx函数作为列中的值DOUBLE。请注意,返回的值可能不在数据集中。

select location, weekday,
percentile(MyValue,0.1) over w as Weekday10pctile,
percentile(MyValue,0.9) over w as Weekday90pctile
from myschema.my_input_table
window w as (partition by location,weekday)

percentile_approx文档中的描述

percentile_approx(DOUBLE col, p [, B])

返回组中数值列(包括浮点类型)的近似第 p 个百分位数。B 参数以内存为代价控制近似精度。较高的值会产生更好的近似值,默认值为 10,000。当 col 中不同值的数量小于 B 时,这给出了一个精确的百分位值。


推荐阅读