如何在 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。