hive中分组取前N个值的实现

假设您有每门课程的学生分数列表,并使用HIVE取出每门课程的前100名学生的分数。

[En]

Suppose you have a list of students’ scores in each course, and use hive to take out the top 100 students’ scores in each subject.

这是对Top N进行分组的典型要求。

[En]

This is a typical requirement for grouping Top N.

解决思路

对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ….),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同,则行序列+1,否则重新计数。

只要返回row_number()返回值小于100的的成绩记录,就可以返回每个单科成绩前一百的学生。

解决过程

记分单结构

[En]

Score sheet structure

要查看2012年各科目排名前100的学生的成绩,SQL如下

[En]

To check the scores of the top 100 students in each subject in 2012, sql is as follows

com.blue.hive.udf.RowNumber是自定义函数,函数的作用是按指定的列进行分组生成行序列。这里根据每个科目的所有成绩,生成序列,序列值从1开始自增。

假设成绩单记录如下:

[En]

Suppose the record of the transcript is as follows:

按ORDER BY进行全局排序后,记录如下

[En]

After global sorting by order by, the record is as follows

接着执行row_number函数,返回值如下

因为hive是基于MAPREADUCE的,必须保证row_number执行是在reducer中执行。上述的语句保证了成绩表的记录,按照科目和成绩做了全局排序,然后在reducer端执行row_number函数,如果在map端执行了row_number,那么结果将是错误的。

要查看row_number函数在map端还是reducer端执行,可以查看hive的执行计划:

explain不会执行mapreduce计算,只会显示执行计划。

只要row_number函数在reducer端执行,除了使用order by全局排序配合,也可以使用distribute by + sort by。distribute by可以让相同科目的成绩记录发送到同一个reducer,而sort by可以在reducer端对记录做排序。

而使用order by全局排序,只有一个reducer,未能充分利用资源,相比之下,distribute by + sort by在这里更有性能优势,可以在多个reducer做排序,再做row_number的计算。

sql如下:

如果分数有学院场外学院,要找出该学院排名前100的学生,解决办法如下:

[En]

If the score has a college field college, to find out the top 100 students in the college, the solution is as follows:

如果分数有学院场外学院,要找出该学院排名前100的学生,解决办法如下:

[En]

If the score has a college field college, to find out the top 100 students in the college, the solution is as follows:

row_number的源码

函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ….),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同,则行序列+1,否则重新计数。

编译后,将其打包到JAR包中,如/usr/local/hive/udf/Bluudf.jar

[En]

After compilation, package it into a jar package, such as / usr/local/hive/udf/blueudf.jar

然后在蜂箱外壳下使用它,如下所示:

[En]

Then use it under hive shell, as follows:

Original: https://www.cnblogs.com/chenjianhong/p/4144280.html
Author: jianhong
Title: hive中分组取前N个值的实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6815/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部