hadoop - 如何在蜂巢中实现百分位数
问题描述
我在蜂巢里有一张这样的桌子
user_id no.of game_plays
u1 52
u2 190
u10 166
u9 100
u3 90
u4 44
u5 21
u7 10
u8 5
以上只是一个非常小的数据样本。
因此,总游戏次数为678
我想计算每个组中的用户,如下所示
who contribute to top 33.3% of total game_plays and
who contribute to between 33.3% and 66.6% of total game_plays
who contribute to bottom 33.3% of total game_plays
基本上,像上面一样将数据分成 3 个组,并从每个组中获取前 20 个用户。
我知道如何在 BigQuery 中实现的逻辑,例如....获取按 game_plays 排序的百分位值,然后在上面的查询中放置一个 case 语句,并在每个组中使用 game_plays 进行排名,然后选择 rank <=20
这给出了我想要的结果。
我不知道如何在蜂巢中实现这种东西。
我已经浏览了以下页面,但没有得到任何想法
并通过下面的功能链接,
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
我知道我必须对函数进行百分位运算……但要确定我是如何实现的。
以下是我尝试过的代码,
select a.user_id,a.game_plays, percentile(a.game_plays,0.66) as percentile
from (
select user_id, sum(game_plays) as game_plays
from game_play_table
where data_date = '2019-06-01'
group by user_id) a
我知道上面的代码没有给出准确的输出,但是在上面写了一个外部查询之后……我可以得到我想要的输出……但是上面的查询输出本身就很不同。
有人可以帮忙吗???
解决方案
您可以使用“案例”来计算百分位数
select user_id,game_plays ,
case when (game_plays * (100 /678)) > 33.3 then 'top 33.3%'
when (game_plays * (100 /678)) > 33.3) and (game_plays * (100 /678)) < 66.6) then 'between 33.3% and 66.6%'
when (game_plays * (100 /678)) < 33.3) then 'less then 33.3%'
end as percentile
from game_play_table
where data_date = '2019-06-01'
group by user_id
推荐阅读
- python - 在 Python 中使用时间约束对两个数据帧进行数据操作
- javascript - jQuery - 复选框启用/禁用 - 与 DB
- c - 参数中的指针,&符号?
- scala - 使用 Mockito 监视带有对象参数的方法会导致 NullPointerException
- java - 给定一个字符串,如果它包含超过 4 个字符,则返回字符串中的第一个字符,否则返回最后一个字符
- resteasy - 如何修复 quarkus 反应端点中的“无法执行选项”?
- javascript - Window.postMessage 事件侦听器未在慢速网络上触发
- rubygems - ID25/rails_emoji_picker gem 不支持暂存和开发环境
- swift - 当集合视图中只有 6 个项目时,请求全局索引 6 的索引路径
- python-3.x - 试图理解 Python 的 AES 方法