Hive【Hive(六)窗口函数】

窗口函数(window functions)

概述

定义

窗口函数能够为每行数据划分 一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行数据。

语法

窗口函数的语法主要包括 窗口函数 两个部分。其中窗口用于定义计算范围,函数用于定义计算逻辑。

sql 复制代码
select order_id,
       order_date,
       amount,
       函数(amount) over (窗口范围) 别名
from order_info;

函数

绝大多数的聚合函数都可以配合窗口函数使用,例如 max、min、sum、count、avg、以及前面学到的 collect_list、collect_set 等。

窗口

窗口范围的定义分为两种,一种是基于 的,一种是基于的。

基于行

sql 复制代码
sum(amount) over(order by 排序字段 rows between 起点 and 终点) 别名

如果起点是下面两种:

  1. unbounded preceding 第一行
  2. num preceding 当前行的前 num 行

则终点可以是:

  1. num preceding 当前行的前 num 行
  2. current row 当前行
  3. num following 当前行的后 num 行
  4. unbounded following 最后一行

如果起点是:

  • current row

那么终点可以是:

  1. current row 当前行
  2. num following 当前行的后 num 行
  3. unbounded following 最后一行

如果起点是:

  • num following

则终点可以是:

  1. num following 当前行的后 num 行
  2. unbounded following 最后一行

注意:

真正进行窗口函数计算的时候,必须选定一个排序的字段(order by),因为每个窗口函数的作用范围会由于 MapReduce 切片、Shuffle 这些因素而不确定(上一行和下一行可能在不同的切片中)。

案例

实际意义:截止当前订单的销售总额。

基于值

sql 复制代码
sum(amount) over (order by 划分窗口范围的字段 range between 起点 and 终点) 别名

除了 over 关键字换成了 range ,别的没有变化。

注意:这里的 order by 并不是指的排序字段,基于值的窗口函数并不会排序,这里的 order by 指的是基于哪个字段在值进行窗口范围的划分。 order by 的字段可以是数值型(比如计算指定窗口范围值 num 的就必须是数值型)也可以是别的类型(这时 order by 的字段不可以通过 num 指定窗口范围 )。

同样,基于列的窗口函数中,num preceding 和 num following 中的 num 指的是当前值 -num 和 +num。

案例

实际意义:截止当前日期的销售总额。

分区

定义窗口范围时,可以指定分区字段,每个分区单独划分一个窗口。

sql 复制代码
sum(amount) over (partition by 划分窗口范围的字段 rows between 起点 and 终点) 别名
案例

实际意义:每个用户截止到最后下单的累计下单金额。

缺省

over() 中的三部分内容 partition by、order by 、(rows |range) between ... and ... 均可省略不写。

partition by 省略不写,代表不分区。

order by 省略不写:

  1. 如果是基于 row 的,则 order by 必须写,除非窗口范围是第一行到最后一行(rows between unbounded preceding and unbounded following)。
  2. 如果是基于 range ,order by 同样必须写。因为如果不写,就相当于没有声明根据哪个字段的值来声明窗口的范围,同样无效,此时,窗口范围是 (负无穷,正无穷)。

(rows |range) between ... and ...省略不写:

  1. 如果over()中包含 order by:则默认值为 range between unbounded preceding and current row
  2. 如果over()中不包含 order by:则默认值为 rows between unbounded preceding and unbounded following

常用窗口函数

相关推荐
卷毛迷你猪1 天前
快速实验篇(A11)数据集成与多维分析:从单实验产出到跨实验宽表
hive·hadoop
西木莉1 天前
数据仓库概述
数据仓库
卷毛迷你猪2 天前
快速实验篇(A10)短序列上 SPI 的失效机制
hadoop
Francek Chen2 天前
【大数据处理与分析】数据仓库Hive:04 数据仓库Hive概述
大数据·数据仓库·hive·hadoop·分布式
Gl�ria3 天前
Hadoop/YARN 集群缩容:下线DN节点
大数据·hadoop·分布式
计算机源码社3 天前
基于大数据技术的台北市住宅价格影响因素挖掘与可视化分析-基于Python与Hadoop的台北市住宅价格数据仓库构建与可视化
大数据·hadoop·python·数据分析·spark·毕业设计·数据可视化
计算机源码社3 天前
基于Hadoop+Spark的乳腺癌病理数据可视化分析系统 基于K-Means聚类与PCA降维的乳腺癌形态特征分析系统
大数据·hadoop·python·数据分析·spark·毕业设计·数据可视化
Moshow郑锴3 天前
从“水库”到“直饮水站”:重新理解 Data Mart 与 Data Lake、Data Lakehouse、Data Warehouse 的区别
数据仓库·data·湖仓一体
躺柒4 天前
读数据架构知识体系指南01关系数据仓库(上)
数据仓库·架构·数据分析·spark·数据湖·关系数据库·企业数据仓库
卷毛迷你猪4 天前
快速实验篇(A9-2)Python vs MapReduce:小批量任务的工具选择
大数据·hadoop