首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Hive SQL中列出每个类别的前10行

如何在Hive SQL中列出每个类别的前10行
EN

Stack Overflow用户
提问于 2019-09-18 18:56:48
回答 2查看 420关注 0票数 1

我有一个表,其中一列包含类别数据(让我们称其为'category'),另一列包含任意字符串(我们称其为'text')。

现在我想看到每个类别的几个文本示例,换句话说:对于每个类别显示文本的前5个值。文本值不需要按任何标准排序(我不想要前5个最长的字符串或类似的东西),只需要第一个遇到的(随机)字符串。

结果应该如下所示:

代码语言:javascript
运行
复制
+----------+------------------+
| 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 |
| ...      | ...              |

我不能承受二次复杂性,因为这个表真的很大,有数千万行。

我还希望避免手动联合每个类别的子查询

代码语言:javascript
运行
复制
select ... where category = catA
union 
select ... where category = catB
union
select ... where category = catC
union
...

因为有50个不同的类别。

最重要的是,我不能使用任何特定于数据库的特性,因为我的数据库不是任何传统的关系数据库,而是只支持基本SQL语法的Apache Hive。

我知道有很多严格的要求。但如果有人知道如何用简单的SQL解决这个问题,那将会对我有很大帮助。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-18 18:58:26

您可以在包括配置单元在内的大多数数据库中使用row_number()。对于每个类别10个示例,例如:

代码语言:javascript
运行
复制
select t.*
from (select t.*,
             row_number() over (partition by category order by category) as seqnum
      from t
     ) t
where seqnum <= 10;
票数 3
EN

Stack Overflow用户

发布于 2019-09-19 20:01:23

一般的答案是:如果不支持某种过程语言和优化的GROUP BY操作,就无法做到这一点。

如果数据库系统支持快速SELECT category FROM thetable GROUP BY category,并且使用过程性语言循环遍历这些值,那么您可以循环遍历GROUP BY的结果,并在每次迭代中添加SELECT * FROM thetable WHERE category = categoryvalue LIMIT 5的结果。

Apache Hive中的SQL支持包括对未排序SELECT语句的限制。

还有用于SQL CREATE PROCEDURE的HPL/SQL http://www.hplsql.org/udf-sproc

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57991139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档