如何在 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 个元素并返回所选数组

访问组中的前 n 个

Django列出包含某些相同项目的类别中的项目

查询用户出现在表中后的前 48 小时活动 (HiveQL / SQL)

如何在 hive sql 中获取每个组的最大 row_number()

如何从大字典中列出的每个类别的所有可能的值组合创建数据框