如何在 Hive SQL 中列出每个类别中的前 10 行
Posted
技术标签:
【中文标题】如何在 Hive SQL 中列出每个类别中的前 10 行【英文标题】:How to list first 10 rows in each category in Hive SQL 【发布时间】:2019-09-18 10:56:47 【问题描述】:我有一个表,其中包含一个包含分类数据的列(我们称之为“类别”)和另一个包含任意字符串的列(我们称之为“文本”)。
现在我想查看每个类别的几个文本示例,换句话说:每个类别显示前 5 个文本值。文本值不需要按任何标准排序(我不想要前 5 个最长的字符串或类似的东西),只需要第一个遇到的(随机)。
结果应该是这样的:
+----------+------------------+
| category | text |
+----------+------------------+
| cat A | random string 1 |
| cat A | random string 2 |
| cat A | random string 3 |
| cat A | random string 4 |
| cat A | random string 5 |
| cat B | random string 6 |
| cat B | random string 7 |
| cat B | random string 8 |
| cat B | random string 9 |
| cat B | random string 10 |
| cat C | random string 11 |
| ... | ... |
我无法承受二次复杂度,因为表真的很大,有数千万行。
我还想避免手动合并每个类别的子查询
select ... where category = catA
union
select ... where category = catB
union
select ... where category = catC
union
...
因为大约有 50 个不同的类别。
最重要的是,我不能使用任何特定于数据库的功能,因为我的数据库不是任何传统的关系数据库,而是一个只支持基本 SQL 语法的 Apache Hive。
我知道有很多严格的要求。但是,如果有人知道如何用普通的 SQL 解决这个问题,那将对我有很大帮助。谢谢。
【问题讨论】:
@TimBiegeleisen 这不是重复的。所有其他问题都要求前 10 个条目,这意味着按某些标准排序,而我需要任意 10 个条目。他们的解决方案需要对每个类别的结果进行排序,这增加了复杂性。我在问题中充分解释了它与之前的问题有何不同,请删除重复标记。 @Youda008 尝试 Gordon 的答案,但在对ROW_NUMBER
的调用中使用 ORDER BY RAND()
。我没有看到您想要随机条目,也没有看到您正在使用 Hive,抱歉。
【参考方案1】:
您可以在包括 Hive 在内的大多数数据库中使用 row_number()
。对于每个类别 10 个示例,例如:
select t.*
from (select t.*,
row_number() over (partition by category order by category) as seqnum
from t
) t
where seqnum <= 10;
【讨论】:
OP 似乎想要ORDER BY RAND()
。
@TimBiegeleisen 。 . . “文本值不需要按任何标准排序(我不想要前 5 个最长的字符串或类似的东西),只需要第一个遇到的(随机)字符串。” OP 似乎想要任意值,但rand()
绝对可以接受。
这个成功了,而且速度足够快,谢谢。【参考方案2】:
一般的答案是:如果不支持某种程序语言和优化的 GROUP BY 操作,它就无法完成。
如果数据库系统支持快速SELECT category FROM thetable GROUP BY category
,以及循环遍历值的过程语言,那么您可以循环遍历 GROUP BY 的结果并在每次迭代中添加 SELECT * FROM thetable WHERE category = categoryvalue LIMIT 5
的结果。
Apache Hive 中的 SQL 支持在未排序的 SELECT 语句中包括 LIMIT。
还有用于 SQL CREATE PROCEDURE 的 HPL/SQL http://www.hplsql.org/udf-sproc。
【讨论】:
以上是关于如何在 Hive SQL 中列出每个类别中的前 10 行的主要内容,如果未能解决你的问题,请参考以下文章
hive sql - 如何选择 hive 数组列中的前 n 个元素并返回所选数组
查询用户出现在表中后的前 48 小时活动 (HiveQL / SQL)