Hive查询按百分比计数选择前2行并显示为列

时间:2016-10-28 21:44:42

标签: hive

我的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

请记住,这只是一个样本表,我一直非常简单地解释目的。

1 个答案:

答案 0 :(得分:0)

要获得每个ID的前2名,您可以使用rank()函数,请参阅示例here

要获得总体百分比,您可以使用聚合表加入ID:

select ID,sum(count) as sum from input_table group by ID

最后,如果您想将表从ID, Cat, %转换为每行一个ID,则需要在子collect_listCat中使用%查询然后为数组元素

创建一列
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;