前言:
同上篇Hadoop MapReduce 实现分组Top n介绍一样,这次学习Hive实现分组Top n。
案例:
在数据处理中,经常会碰到这样一个场景,对表数据按照某一字段分组,然后找出各自组内最大的几条记录情形。针对这种分组Top N问题,我们利用Hive、MapReduce等多种工具实现一下。
场景模拟:
对类如下users表记录,取出不同grade下得分最多的两条记录
id grade score
1 A 10
2 A 40
3 B 30
4 C 20
5 B 10
6 D 40
7 A 30
8 C 20
9 B 10
10 D 40
11 C 30
12 D 20
1、普通SQL实现:
先对users根据grade进行分区,然后根据score进行倒序排序,再应用row_number函数从每个分区中筛选出各个分区的前两条记录。
WITH groupsort AS (
SELECT *, rid = ROW_NUMBER() OVER
(PARTITION BY grade ORDER BY score DESC) FROM users
)
SELECT id, grade, score FROM groupsort WHERE rid <= 2;
这里使用WITH AS抽离子查询部分,相当于定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性、优化性