Как реализовать процентиль в улье - PullRequest
0 голосов
/ 07 июля 2019

У меня есть такая таблица в улье

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 </p> * 1016.* которые дают желаемый результат.

Я не знаю, как реализовать подобные вещи в улье.

Я просмотрел страницы ниже, но не понял

Как реализовать процентиль в Hive?

Как рассчитать медиану в Hive

И прошли по ссылке на функции ниже:

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

Я знаю, что приведенный выше код не дает точного результата, но после написания внешнего запроса черезэто .... Я могу получить вывод, который я хотел .... но вышеупомянутый вывод запроса сам по себе сильно отличается.

Может кто-нибудь, пожалуйста, помогите ???

1 Ответ

0 голосов
/ 07 июля 2019

Вы можете использовать "case" для вычисления процентиля

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
...