蜂巢如何限制collect_set中的条目数

时间:2018-06-26 17:19:38

标签: hive hiveql

假设我有一个包含两列的表:

Category Productname
Cat1     prod1
Cat1     prod2
Cat1     prod3
Cat1     prod4
Cat1     prod5
Cat2     prod6
Cat2     prod7
Cat2     prod8

现在,如果我做类似的事情:

SELECT Category, collect_set(Productname)
FROM myTable;

我会得到类似的东西

Cat1    [prod1...prod5]
Cat2    [prod6...prod8]

现在,cat中有5种产品,cat2中有3种产品。但是,我想限制每个类别中的产品数量。假设上限为3。这3个产品可以是任意随机产品,只要它们属于同一类别即可。上限也可以很大。值得注意的是,我要使collect_set在达到上限后停止。因为生成输出然后执行过滤可能很昂贵。也欢迎使用collect_set以外的方法。感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

您可以通过窗口函数和collect_set的组合来执行此操作。按类别进行分区,并为每个类别,产品组合获取<= 3行,然后在子集中使用collect_set。

select category, collect_set(productname)
from 
(
    select category,productname, row_number() over (partition by category) as r_no
    from table_name
) a
where a.r_no <= 3