транспонировать в столбцы верхние n частых значений по id - PullRequest
1 голос
/ 29 марта 2019

Я работаю над Hive. Я хочу, чтобы в этой таблице я выбрал 2 наиболее часто встречающихся значения в столбце user_agent и поместил их все в одну строку, обобщив информацию.

У меня есть база данных, которая выглядит следующим образом:

userID | user_agent 
1      |  Windows NT 6.1
1      |  Windows NT 6.1
1      |  Windows NT 6.1
1      |  Macintosh
1      |  Macintosh
2      |  Windows NT 6.1
2      |  Windows NT 6.1
2      |  Macintosh
2      |  X11
3      |  X11
3      |  X11
4      |  Windows NT 6.1
4      |  X11
5      |  iPhone
6      |  X11
6      |  iPhone
7      |  
7      |  
7      |  
7      |  Windows NT 6.1

Важно отметить, что user_agent намного сложнее, чем в таблице примеров, имея огромное количество уникальных значений, поэтому я не могу работать с пустышками. (Я пробовал)

Давайте назовем наиболее распространенный столбец значений как top_1_user_agent, а второй наиболее распространенный столбец - top_2_user_agent.

Когда есть только значение, значение top_2_user_agent должно быть нулевым, как с userID 3. Когда есть «ничья», как с userID 2 и userID 6, выбранное значение должно быть первым по порядку в таблице.

Результат должен выглядеть так:

userID | top_1_user_agent |   top_2_user_agent 
1      |  Windows NT 6.1  | Macintosh
2      |  Windows NT 6.1  | Macintosh
3      |  X11             | 
4      |  Windows NT 6.1  | X11
5      |  iPhone          | 
6      |  X11             | iPhone    
7      |                  | Windows NT 6.1

Любая помощь приветствуется. Спасибо!

1 Ответ

1 голос
/ 29 марта 2019

rank() и collect_set() должны это сделать.

select userID,collect_set(user_agent)
from 
(
    select *, rank() over (partition by userID,user_agent order by cnt desc) as rank
    from
    (
        select userID,user_agent, count(*) as cnt
        from yourtable
        group by userID,useragent
    ) x
) y
where rank <= 2
group by userID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...