Hive如何限制collect_set中的条目数

标签 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]

现在,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/

相关文章:

excel - noob到Hadoop,上传带有列标题的制表符分隔文本文件,如何在Hive中使用它?

sql - 我们如何在不引用表的情况下测试HIVE功能

hadoop - 基于子查询在配置单元表中添加分区

Hadoop排名列

sql - SQL:通过删除左右字符来获取子字符串

hadoop - pig 脚本中的代理键

sql - 当列中的所有值并非都相等时返回数据

runtime - Hive 查找查询的预期运行时间

hadoop - OrcNewInputformat作为hadoop流的输入格式

hadoop - Hive 表的名称现在是保留关键字