如何在 Hive SQL 中列出每个类别的前 10 行
How to list first 10 rows in each category in Hive SQL
我有一个 table,其中包含一个包含分类数据的列(我们称之为 'category')和另一个包含任意字符串的列(我们称之为 'text')。
现在我想看到每个类别的几个文本示例,换句话说:对于每个类别显示文本的前 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 |
| ... | ... |
我无法承受二次复杂度,因为 table 真的很大,有数千万行。
我还想避免手动合并每个类别的子查询
select ... where category = catA
union
select ... where category = catB
union
select ... where category = catC
union
...
因为大约有 50 个不同的类别。
最重要的是,我不能使用任何特定于数据库的功能,因为我的数据库不是任何传统的关系数据库,而是仅支持基本 SQL 语法的 Apache Hive。
很多严格的要求,我知道。但是,如果有人知道如何简单地解决这个问题 SQL,那将对我有很大帮助。谢谢
您可以在大多数数据库中使用 row_number()
,包括 Hive。对于每个类别 10 个示例,例如:
select t.*
from (select t.*,
row_number() over (partition by category order by category) as seqnum
from t
) t
where seqnum <= 10;
一般答案是:如果不支持某种过程语言和优化的 GROUP BY 操作,就无法完成。
如果数据库系统支持快速 SELECT category FROM thetable GROUP BY category
和循环遍历值的过程语言,那么您可以遍历 GROUP BY 的结果并在每个中添加 SELECT * FROM thetable WHERE category = categoryvalue LIMIT 5
的结果迭代。
SQL Apache Hive 中的支持包括未排序的 SELECT 语句中的 LIMIT。
还有 HPL/SQL http://www.hplsql.org/udf-sproc 用于 SQL CREATE PROCEDURE。
我有一个 table,其中包含一个包含分类数据的列(我们称之为 'category')和另一个包含任意字符串的列(我们称之为 'text')。
现在我想看到每个类别的几个文本示例,换句话说:对于每个类别显示文本的前 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 |
| ... | ... |
我无法承受二次复杂度,因为 table 真的很大,有数千万行。
我还想避免手动合并每个类别的子查询
select ... where category = catA
union
select ... where category = catB
union
select ... where category = catC
union
...
因为大约有 50 个不同的类别。
最重要的是,我不能使用任何特定于数据库的功能,因为我的数据库不是任何传统的关系数据库,而是仅支持基本 SQL 语法的 Apache Hive。
很多严格的要求,我知道。但是,如果有人知道如何简单地解决这个问题 SQL,那将对我有很大帮助。谢谢
您可以在大多数数据库中使用 row_number()
,包括 Hive。对于每个类别 10 个示例,例如:
select t.*
from (select t.*,
row_number() over (partition by category order by category) as seqnum
from t
) t
where seqnum <= 10;
一般答案是:如果不支持某种过程语言和优化的 GROUP BY 操作,就无法完成。
如果数据库系统支持快速 SELECT category FROM thetable GROUP BY category
和循环遍历值的过程语言,那么您可以遍历 GROUP BY 的结果并在每个中添加 SELECT * FROM thetable WHERE category = categoryvalue LIMIT 5
的结果迭代。
SQL Apache Hive 中的支持包括未排序的 SELECT 语句中的 LIMIT。
还有 HPL/SQL http://www.hplsql.org/udf-sproc 用于 SQL CREATE PROCEDURE。