假设我有一个包含两列的表:
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]
现在,Cat1 中有 5 个产品,Cat2 中有 3 个产品。但是,我想限制每个类别中的产品数量。假设上限是3个,这3个产品可以是任意的,只要属于同一个品类即可。此外,上限可以是一个很大的数字。值得注意的是,我希望 collect_set 在达到上限后停止。因为生成输出然后执行过滤可能很昂贵。也欢迎使用 collect_set 以外的方法。感谢您的任何建议!
最佳答案
您可以通过结合使用窗口函数和 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
关于Hive如何限制collect_set中的条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51048379/