我的hadoop集群中有一个类似下面的表格
ID | CATEGORY | COUNT
101 | A | 40
101 | B | 40
101 | C | 20
102 | D | 10
102 | A | 20
102 | E | 30
102 | F | 40
我必须编写一个Hive查询,它将按百分比计数显示ID和前2个类别作为列。所以我的结果表看起来应该是
ID | CAT1 | % | CAT2 | %
101 | A | 40 | B | 40
102 | F | 40 | E | 30
请记住,这只是一个样本表,我一直非常简单地解释目的。
答案 0 :(得分:0)
要获得每个ID的前2名,您可以使用rank()
函数,请参阅示例here。
要获得总体百分比,您可以使用聚合表加入ID:
select ID,sum(count) as sum from input_table group by ID
最后,如果您想将表从ID, Cat, %
转换为每行一个ID,则需要在子collect_list
和Cat
中使用%
查询然后为数组元素
Select ID, categories[0], pcts[0],categories[1], pcts[1] from (
Select a.ID, collect_list(Cat) as categories , collect_list(Count/sum) as pcts from (
Select ID, Cat, Count, rank from (
SELECT ID, Cat, Count,
rank() over (PARTITION BY ID ORDER BY Count DESC) as rank
FROM input_table) inner where rank <= 2 ) a,
(select ID,sum(count) as sum from input_table group by ID) b where a.ID = b.ID
group by a.ID ) inner;