hive - 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
解决方案
使用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(DOUBLE col, p [, B])
返回组中数值列(包括浮点类型)的近似第 p 个百分位数。B 参数以内存为代价控制近似精度。较高的值会产生更好的近似值,默认值为 10,000。当 col 中不同值的数量小于 B 时,这给出了一个精确的百分位值。
推荐阅读
- python - 如何按小时汇总数据?
- angular - Angular Universal、元标记、复制链接、粘贴到社交 AZURE MSAL AUTHENTICATION crypto_nonexistent:加密对象或函数不可用
- multithreading - 从 Rust 中的多个线程写入内存映射文件
- python - 在列表 x 中插入 n --> 将列表 x 附加到列表 y --> 在列表 x 中删除 n
- python - 如何使用 python 将文本附加到文件中?
- mysql - 创建触发器后SQL无法插入数据
- javascript - 如何为 DataTables 制作预加载器?
- woocommerce - Woocommerce 退款选项不起作用(行为不端)
- c# - 如何转换此程序使其不使用 LINQ?
- python - 使用 statsmodels OLS 时出现奇怪错误:numpy.linalg.LinAlgError:SVD 未收敛