Hive 按id将前n个频繁值转置到列

Hive 按id将前n个频繁值转置到列,hive,hiveql,Hive,Hiveql,我在做蜂箱。我想对这个表进行功能设计,在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 | Window

我在做蜂箱。我想对这个表进行功能设计,在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
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
需要注意的是,user_代理比示例表中使用的要复杂得多,具有大量的唯一值,因此我无法使用假人。我试过了

让我们将最常见的值列称为top_1_user_agent,将第二常见的值列称为top_2_user_agent

当只有一个值时,top_2_user_agent值必须为null,就像userID 3一样。 当有绘图时,如userid2和userid6,所选的值必须是表中的第一个顺序值

结果必须如下所示:

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
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
欢迎任何帮助。谢谢

rank and collect\u 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
哦,您在查询结束时忘记了按用户ID分组。好吧,我问的大部分都是收集集做的。这对我来说已经是一个很好的开始。谢谢