Hive 按id将前n个频繁值转置到列
我在做蜂箱。我想对这个表进行功能设计,在user_agent列中选择前两个最常见的值,并将其全部放在一行中,总结信息 我有一个如下所示的数据库: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
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分组。好吧,我问的大部分都是收集集做的。这对我来说已经是一个很好的开始。谢谢