Hive 中的window函数

1. 概念

        hive中的窗口函数和sql中的窗口函数相类似,一般用于OLAP分析(在线分析处理)。有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这便要用到窗口函数了。注意:

在SQL处理中,窗口函数(over 关键字) 都是最后一步执行,且仅位于Order by字句之前

应用场景:

1. 用于分区排序;

2. 动态Group By;

3. Top N;

4. 累计计算;

5. 层次查询。

实验数据

uid,dt,pv

A,2018-04-10,1
A,2018-04-11,5
A,2018-04-12,7

A,2018-04-13,3

A,2018-04-14,2

A,2018-04-15,4

A,2018-04-16,4
B,2018-04-11,3
B,2018-04-12,5

2. 窗口函数 part1

2.1 ROW_NUMBER()

        常用于分组内topN 场景,从1开始按照顺序,生成分组内记录的序列。

2.2 RANK & DENSE_RANK

        rank() 生成数据项在分组中的排名,排名相等会在名次中留下空位;而dense_rank() 在排名相等时则不会在名次中留下空位。

select uid,dt,pv,
rank() over(partition by uid order by pv desc) as rn1,
dense_rank() over(partition by uid order by pv desc) as rn2,
row_number() over(partition by uid order by pv desc) as rn3 
from XX;

2.3 NTILE

        ntile 把有序的数据集合平均分配到指定的num个桶中,将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最

Hive中的开窗函数Window Function)是一种强大的分析工具,它允许在数据集中执行聚合、排序、排名等操作,同时保留原始数据行。开窗函数的核心在于定义一个“窗口”或“数据集范围”,在这个范围内执行计算。 ### 基本语法 Hive开窗函数的基本语法如下: ```sql function_name (expression) OVER ( [PARTITION BY partition_expression] [ORDER BY order_expression] [window_frame_clause] ) ``` - `function_name`:可以是聚合函数(如`SUM`, `AVG`, `COUNT`)或排名函数(如`ROW_NUMBER`, `RANK`, `DENSE_RANK`)。 - `PARTITION BY`:将数据划分为多个分区,每个分区独立进行计算。 - `ORDER BY`:在窗口内对数据进行排序。 - `window_frame_clause`:定义窗口的范围,例如`ROWS BETWEEN ... AND ...`。 ### 示例 #### 1. 聚合开窗函数 假设有一个名为`stu_scores`的表,包含学生的成绩信息,包括学生ID (`stu_id`)、数学成绩 (`math`) 和班级ID (`class_id`)。可以使用开窗函数计算每个班级的学生人数: ```sql select stu_id, math, class_id, count(math) over(partition by class_id) as ct1 from stu_scores; ``` 此查询将按`class_id`分组,并计算每个班级的学生人数[^2]。 #### 2. 排名开窗函数 Hive提供了几种排名函数,如`ROW_NUMBER`, `RANK`, 和 `DENSE_RANK`。这些函数可以用于对数据进行排名。例如,假设有一个名为`student_scores`的表,包含学生ID (`studentId`)、数学成绩 (`math`) 和班级ID (`classId`),可以使用`ROW_NUMBER`为每个班级的学生按数学成绩排序: ```sql select studentId, math, classId, row_number() over(partition by classId order by math desc) as rank from student_scores; ``` 此查询将按`classId`分组,并在每个班级内按数学成绩降序排列学生[^2]。 #### 3. 聚合与窗口范围 可以结合窗口范围定义更复杂的计算。例如,计算每个班级中当前行及其前后几行的数学成绩总和: ```sql select studentId, math, classId, sum(math) over(partition by classId order by studentId rows between 1 preceding and 2 following) as sum_math from student_scores; ``` 此查询将按`classId`分组,并在每个班级内按学生ID排序后,计算当前行及其前一行和后两行的数学成绩总和[^3]。 ### 应用场景 Hive开窗函数适用于多种数据分析场景,包括但不限于: - **时间序列分析**:计算移动平均值、累计和等。 - **排名分析**:为数据集中的记录分配排名。 - **分组统计**:在不减少数据行的情况下进行分组统计。 通过这些功能,Hive开窗函数能够提供更灵活和强大的数据分析能力,使得用户能够在大数据环境中进行复杂的分析任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值