`
dacoolbaby
  • 浏览: 1265749 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hive中分组取前N个值的实现-row_number()

    博客分类:
  • Hive
阅读更多

背景

假设有一个学生各门课的成绩的表单,应用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

    02.hive内置函数--窗口分析函数--row_number_over.mp4

    Hive中分组取topN_row_number-rank和dense_rank的使用.pdf

    在这篇文档中,我们将详细学习在Hive中如何进行分组取topN,以及如何使用row_number()、rank()和dense_rank()三种窗口函数进行数据排序和排名。 首先,Hive中的数据表创建和数据插入操作是数据查询和分析的前提。...

    Hive-工具篇_hive_

    - **窗口函数**:ROW_NUMBER、RANK、LEAD和LAG等窗口函数在分析排序数据时非常有用,例如计算排名或滞后/领先值。 6. **Hive函数全攻略** - **内置函数**:包括字符串函数(如CONCAT、SUBSTRING)、数学函数(如...

    hive分析函数

    本文将介绍 Hive 中的四个序列函数:NTILE、ROW_NUMBER、RANK 和 DENSE_RANK。 首先,让我们了解什么是序列函数。序列函数是 Hive 中的一种特殊函数,用于对数据进行排序和编号。序列函数可以将数据分组并对每组...

    hive开窗函数详细介绍

    其中,Hive的窗口函数是数据分析中的一种强大功能,可以用来处理复杂的排序和分组计算。本文将详细探讨Hive的开窗函数,包括ROW_NUMBER、RANK、DENSE_RANK以及分析窗口函数SUM、AVG、MIN和MAX的用法。 一、窗口函数...

    hive开窗函数.docx

    RANK() 函数类似 ROW_NUMBER(),但当遇到相同值时,它会分配相同的排名,然后跳过下一个排名。例如,在销售数据中,如果有两个销售人员的销售额相同,他们都会获得相同的排名,接下来的销售人员排名将会是当前排名...

    rowid与rownumber

    rowid 与 rownumber 的介绍和应用 rowid 和 rownum 是 Oracle 数据库中的两个重要概念,对于数据库开发人员来说非常重要。下面我们将详细介绍 rowid 和 rownum 的概念、结构、应用场景等。 一、rowid 概念 rowid ...

    hive数据加载导出查询

    - **INSERT INTO**: 若想将数据导出到另一个 Hive 表中,可以使用 `INSERT INTO` 语句。 ```sql CREATE TABLE db_0309.emp_backup AS SELECT * FROM db_0309.emp; ``` 或者 ```sql INSERT INTO TABLE db_...

    2024年最新,Hive SQL经典面试题,大数据SQL经典面试题

    - **Top N问题**: 主要是找出某个表中的前N项记录。 - **Explode问题**: 处理多值字段,将其展开成多行记录。 - **行转列问题**: 将表中的行转换为列,适用于数据透视操作。 掌握这些Hive SQL技巧对于处理复杂的...

    hiveSQL实战案例

    在Hive SQL实战中,我们经常会遇到各种查询需求,这里我们将通过三个具体案例来探讨Hive SQL中的关键知识点,包括窗口函数的应用以及处理用户数据的技巧。 首先,我们来看窗⼝函数row_number(), rank()和dense_rank...

    hive常用函数参数手册

    - **Top-N**: 查找每个分组内的前N项。 - **累计计算**: 计算累积和、累积平均等。 - **层次查询**: 处理层级结构的数据,如树形结构。 #### 四、示例 ##### 创建表 ```sql CREATE TABLE employee ( id STRING, ...

    大数据hive中窗口函数的一些常用函数

    * ROW_NUMBER() :不间断,序号不重复,例如 1、2、3、4、5(1、2 可能是相同的值)。 3. 取值型函数: * LAG(COL, N, DEFAULT_VAL) :用于统计窗口内往上第n行值。 * LEAD(COL, N, DEFAULT_VAL) :用于统计窗口内...

    Hive常用函数

    - **Top N**:通过 ORDER BY 和 LIMIT 子句可以获取每个组的前 N 条数据。 - **累计计算**:窗口函数可以实现数据的累计计算,如累计销售额。 - **层次查询**:配合递归查询或自连接可以处理层次数据,如组织结构...

    自定义hive函数

    至于“rownum”,在标准SQL中,`ROW_NUMBER()`是一个窗口函数,但在Hive中,你需要使用`ROW_NUMBER()`或者`RANK()`等内置函数来实现类似的功能,为每一行分配一个唯一的行号。如果Hive内置的函数无法满足需求,你...

    Hive开窗函数测试-cube,rollup

    在Hive中,窗口函数包括`row_number()`, `rank()`, `dense_rank()`, `percent_rank()`, `ntile()`, `lag()`, `lead()`等,它们对于排序数据、分组计算以及追踪行之间的关系特别有用。例如,`lag()`可以用来查看当前...

    尚硅谷大数据技术之Hive-04(面试题)1

    Hive提供了窗口函数如`row_number()`, `lead()`, `lag()`等,可以对数据进行排序并基于此进行计算。在这个问题中,可以先按用户id和日期排序,然后计算连续日期之间的碳排放量,如果连续两天的碳排放量都大于100,则...

    《企业级Hive实战课程》大纲

    随着大数据技术的发展,Hive作为Hadoop生态系统中的一个重要组成部分,对于企业的数据分析和处理起着核心作用。Facebook、淘宝等大型互联网公司均采用Hive进行大规模的数据分析,尤其是在离线统计领域,Hive的应用...

    hive_data.rar

    在Hive中,虽然没有内置的自增ID机制,但可以通过其他方式实现类似功能,例如使用ROW_NUMBER()窗口函数或在外部程序中生成自增ID后再导入Hive。 最后,“搜狗原始数据”可能是指来自搜狗实验室的原始日志或其他形式...

    Hive SQL大厂必考常用窗口函数及面试题.pdf

    【Hive SQL大厂必考常用窗口函数及面试题】主要涵盖了窗⼝函数在大数据分析中的应用,尤其在OLAP(在线分析处理)场景中的重要性。窗⼝函数是一种标准SQL功能,它允许对数据库数据进行实时分析处理,如市场分析、...

Global site tag (gtag.js) - Google Analytics