背景
假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩。
这个就是典型在分组取Top N的需求。
解决思路
对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同,则行序列+1,否则重新计数。
只要返回row_number()返回值小于100的的成绩记录,就可以返回每个单科成绩前一百的学生
create table score_table ( subject string, student string, score int ) partitioned by (date string);
如果要查询2012年每科成绩前100的学生成绩,sql如下
create temporary function row_number as 'com.blue.hive.udf.RowNumber'; select subject,score,student from (select subject,score,student from score where dt='2012' order by subject,socre desc) order_score where row_number(subject) <= 100;
com.blue.hive.udf.RowNumber是自定义函数,函数的作用是按指定的列进行分组生成行序列。这里根据每个科目的所有成绩,生成序列,序列值从1开始自增。
执行row_number函数,返回值如下
科目 成绩 学生 row_number 物理 100 张一 1 物理 90 张二 2 物理 80 张三 3 ..... 数学 100 李一 1 数学 90 李二 2 数学 80 李三 3 ....
row_number的源码
函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同,则行序列+1,否则重新计数。
package com.blue.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; public class RowNumber extends UDF { private static int MAX_VALUE = 50; private static String comparedColumn[] = new String[MAX_VALUE]; private static int rowNum = 1; public int evaluate(Object... args) { String columnValue[] = new String[args.length]; for (int i = 0; i < args.length; i++) 『 columnValue[i] = args[i].toString(); } if (rowNum == 1) { for (int i = 0; i < columnValue.length; i++) comparedColumn[i] = columnValue[i]; } for (int i = 0; i < columnValue.length; i++) { if (!comparedColumn[i].equals(columnValue[i])) { for (int j = 0; j < columnValue.length; j++) { comparedColumn[j] = columnValue[j]; } rowNum = 1; return rowNum++; } } return rowNum++; } }
编译后,打包成一个jar包,如/usr/local/hive/udf/blueudf.jar
然后在hive shell下使用,如下:
add jar /usr/local/hive/udf/blueudf.jar; create temporary function row_number as 'com.blue.hive.udf.RowNumber'; select subject,score,student from (select subject,score,student from score where dt='2012' order by subject,socre desc) order_score where row_number(subject) <= 100;
同样,这个函数可以用作去重操作。
可以替代大批量数据的DISTINCT
通过执行如:
select * from(
select type,value,row_number() as rn
from log_table
distribute by type,value
sort by type,value
)
where rn = 1;
===============注意!============================
但是使用row_number()函数需要注意一点,必须使用sort by。
测试的时候必须使用order by。
row_number()函数会假设数据有序的基础上进行的。
相关推荐
02.hive内置函数--窗口分析函数--row_number_over.mp4
在这篇文档中,我们将详细学习在Hive中如何进行分组取topN,以及如何使用row_number()、rank()和dense_rank()三种窗口函数进行数据排序和排名。 首先,Hive中的数据表创建和数据插入操作是数据查询和分析的前提。...
- **窗口函数**:ROW_NUMBER、RANK、LEAD和LAG等窗口函数在分析排序数据时非常有用,例如计算排名或滞后/领先值。 6. **Hive函数全攻略** - **内置函数**:包括字符串函数(如CONCAT、SUBSTRING)、数学函数(如...
本文将介绍 Hive 中的四个序列函数:NTILE、ROW_NUMBER、RANK 和 DENSE_RANK。 首先,让我们了解什么是序列函数。序列函数是 Hive 中的一种特殊函数,用于对数据进行排序和编号。序列函数可以将数据分组并对每组...
其中,Hive的窗口函数是数据分析中的一种强大功能,可以用来处理复杂的排序和分组计算。本文将详细探讨Hive的开窗函数,包括ROW_NUMBER、RANK、DENSE_RANK以及分析窗口函数SUM、AVG、MIN和MAX的用法。 一、窗口函数...
RANK() 函数类似 ROW_NUMBER(),但当遇到相同值时,它会分配相同的排名,然后跳过下一个排名。例如,在销售数据中,如果有两个销售人员的销售额相同,他们都会获得相同的排名,接下来的销售人员排名将会是当前排名...
rowid 与 rownumber 的介绍和应用 rowid 和 rownum 是 Oracle 数据库中的两个重要概念,对于数据库开发人员来说非常重要。下面我们将详细介绍 rowid 和 rownum 的概念、结构、应用场景等。 一、rowid 概念 rowid ...
- **INSERT INTO**: 若想将数据导出到另一个 Hive 表中,可以使用 `INSERT INTO` 语句。 ```sql CREATE TABLE db_0309.emp_backup AS SELECT * FROM db_0309.emp; ``` 或者 ```sql INSERT INTO TABLE db_...
- **Top N问题**: 主要是找出某个表中的前N项记录。 - **Explode问题**: 处理多值字段,将其展开成多行记录。 - **行转列问题**: 将表中的行转换为列,适用于数据透视操作。 掌握这些Hive SQL技巧对于处理复杂的...
在Hive SQL实战中,我们经常会遇到各种查询需求,这里我们将通过三个具体案例来探讨Hive SQL中的关键知识点,包括窗口函数的应用以及处理用户数据的技巧。 首先,我们来看窗⼝函数row_number(), rank()和dense_rank...
- **Top-N**: 查找每个分组内的前N项。 - **累计计算**: 计算累积和、累积平均等。 - **层次查询**: 处理层级结构的数据,如树形结构。 #### 四、示例 ##### 创建表 ```sql CREATE TABLE employee ( id STRING, ...
* ROW_NUMBER() :不间断,序号不重复,例如 1、2、3、4、5(1、2 可能是相同的值)。 3. 取值型函数: * LAG(COL, N, DEFAULT_VAL) :用于统计窗口内往上第n行值。 * LEAD(COL, N, DEFAULT_VAL) :用于统计窗口内...
- **Top N**:通过 ORDER BY 和 LIMIT 子句可以获取每个组的前 N 条数据。 - **累计计算**:窗口函数可以实现数据的累计计算,如累计销售额。 - **层次查询**:配合递归查询或自连接可以处理层次数据,如组织结构...
至于“rownum”,在标准SQL中,`ROW_NUMBER()`是一个窗口函数,但在Hive中,你需要使用`ROW_NUMBER()`或者`RANK()`等内置函数来实现类似的功能,为每一行分配一个唯一的行号。如果Hive内置的函数无法满足需求,你...
在Hive中,窗口函数包括`row_number()`, `rank()`, `dense_rank()`, `percent_rank()`, `ntile()`, `lag()`, `lead()`等,它们对于排序数据、分组计算以及追踪行之间的关系特别有用。例如,`lag()`可以用来查看当前...
Hive提供了窗口函数如`row_number()`, `lead()`, `lag()`等,可以对数据进行排序并基于此进行计算。在这个问题中,可以先按用户id和日期排序,然后计算连续日期之间的碳排放量,如果连续两天的碳排放量都大于100,则...
随着大数据技术的发展,Hive作为Hadoop生态系统中的一个重要组成部分,对于企业的数据分析和处理起着核心作用。Facebook、淘宝等大型互联网公司均采用Hive进行大规模的数据分析,尤其是在离线统计领域,Hive的应用...
在Hive中,虽然没有内置的自增ID机制,但可以通过其他方式实现类似功能,例如使用ROW_NUMBER()窗口函数或在外部程序中生成自增ID后再导入Hive。 最后,“搜狗原始数据”可能是指来自搜狗实验室的原始日志或其他形式...
【Hive SQL大厂必考常用窗口函数及面试题】主要涵盖了窗⼝函数在大数据分析中的应用,尤其在OLAP(在线分析处理)场景中的重要性。窗⼝函数是一种标准SQL功能,它允许对数据库数据进行实时分析处理,如市场分析、...