hive的窗口函数、分析函数有哪些?

简介: 窗口函数FIRST_VALUE:取分组内排序后,截止到当前行,第一个值LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)OVER从句1、使用标准的聚

窗口函数

FIRST_VALUE:取分组内排序后,截止到当前行,第一个值

LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值

LEAD(col,n,DEFAULT):用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL

LAG(col,n,DEFAULT):与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL

OVER从句

1、使用标准的聚合函数COUNTSUMMINMAXAVG

2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列

3、使用PARTITION BYORDER BY语句,使用一个或者多个数据类型的分区或者排序列

4、使用窗口规范,窗口规范支持以下格式:

 

(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)

(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)

(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING


1、当ORDER BY后面缺少窗口从句条件,窗口规范默认是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

2、当ORDER BY和窗口从句都缺失,窗口规范默认是ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

3、OVER从句支持以下函数, 但是并不支持和窗口一起使用它们。

Ranking函数: Rank, NTile, DenseRank, CumeDist, PercentRank.

LeadLag函数.

使用窗口函数进行统计求销量

使用窗口函数sum  over统计销量


hive (hive_explode)> select

user_id,

user_type,

sales,

--分组内所有行

sum(sales) over(partition by user_type) AS sales_1 ,

sum(sales) over(order  by user_type) AS sales_2 ,

--默认为从起点到当前行,如果sales相同,累加结果相同

sum(sales) over(partition by user_type order by sales asc) AS sales_3,

--从起点到当前行,结果与sales_3不同。 根据排序先后不同,可能结果累加不同

sum(sales) over(partition by user_type order by sales asc rows between unbounded preceding and current row) AS sales_4,

--当前行+往前3行

sum(sales) over(partition by user_type order by sales asc rows between 3 preceding and current row) AS sales_5,

--当前行+往前3行+往后1行

sum(sales) over(partition by user_type order by sales asc rows between 3 preceding and 1 following) AS sales_6,

--当前行+往后所有行  

sum(sales) over(partition by user_type order by sales asc rows between current row and unbounded following) AS sales_7

from

order_detail

order by

   user_type,

   sales,

   user_id;


统计之后求得结果如下:


+-----------+------------+--------+----------+----------+----------+----------+----------+----------+----------+--+

|  user_id  | user_type  | sales  | sales_1  | sales_2  | sales_3  | sales_4  | sales_5  | sales_6  | sales_7  |

+-----------+------------+--------+----------+----------+----------+----------+----------+----------+----------+--+

| liliu     | new        | 1      | 23       | 23       | 2        | 2        | 2        | 4        | 22       |

| qiuba     | new        | 1      | 23       | 23       | 2        | 1        | 1        | 2        | 23       |

| zhangsan  | new        | 2      | 23       | 23       | 4        | 4        | 4        | 7        | 21       |

| wagner    | new        | 3      | 23       | 23       | 7        | 7        | 7        | 12       | 19       |

| lilisi    | new        | 5      | 23       | 23       | 17       | 17       | 15       | 21       | 11       |

| qishili   | new        | 5      | 23       | 23       | 17       | 12       | 11       | 16       | 16       |

| wutong    | new        | 6      | 23       | 23       | 23       | 23       | 19       | 19       | 6        |

| lisi      | old        | 1      | 6        | 29       | 1        | 1        | 1        | 3        | 6        |

| wangshi   | old        | 2      | 6        | 29       | 3        | 3        | 3        | 6        | 5        |

| liwei     | old        | 3      | 6        | 29       | 6        | 6        | 6        | 6        | 3        |

+-----------+------------+--------+----------+----------+----------+----------+----------+----------+----------+--+


注意:

结果和ORDER BY相关,默认为升序

如果不指定ROWS BETWEEN,默认为从起点到当前行;

如果不指定ORDER BY,则将分组内所有值累加;


关键是理解ROWS BETWEEN含义,也叫做WINDOW子句:

PRECEDING:往前

FOLLOWING:往后

CURRENT ROW:当前行

UNBOUNDED:无界限(起点或终点)

UNBOUNDED PRECEDING:表示从前面的起点

UNBOUNDED FOLLOWING:表示到后面的终点

其他COUNTAVGMINMAX,和SUM用法一样。


分析函数

  1. ROW_NUMBER():

特征:相同的有先后排名,排名连续

从1开始,按照顺序,生成分组内记录的序列。

比如:

1、按照pv降序排列,生成分组内每天的pv名次

2、获取分组内排序第一的记录;获取一个session中的第一条refer等。

  1. RANK() :

特征:相同的有相同的排名,排名相等会在名次中留下空位,排名跳跃

  1. DENSE_RANK() :

特征:相同的有相同的排名,排名相等不会在名次中留下空位,排名连续

  1. CUME_DIST :

小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数?

  1. PERCENT_RANK :

分组内当前行的RANK值-1/分组内总行数-1

  1. NTILE(n) :

   用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个NTILE ROWS BETWEEN NTILE(2)


目录
相关文章
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
57 4
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
53 2
|
2月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
43 2
|
7月前
|
SQL HIVE
hive高频函数(一)
hive高频函数(一)
59 0
|
3月前
|
SQL JavaScript 前端开发
Hive根据用户自定义函数、reflect函数和窗口分析函数
Hive根据用户自定义函数、reflect函数和窗口分析函数
42 6
|
3月前
|
SQL JavaScript 前端开发
Hive学习-lateral view 、explode、reflect和窗口函数
Hive学习-lateral view 、explode、reflect和窗口函数
60 4
|
6月前
|
SQL 数据采集 数据可视化
基于Hive的招聘网站的大数据分析系统
基于Hive的招聘网站的大数据分析系统
150 2
|
6月前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
254 0
|
7月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
162 2
Hive函数全解——思维导图 + 七种函数类型
|
7月前
|
SQL 数据采集 存储
Hive实战 —— 电商数据分析(全流程详解 真实数据)
关于基于小型数据的Hive数仓构建实战,目的是通过分析某零售企业的门店数据来进行业务洞察。内容涵盖了数据清洗、数据分析和Hive表的创建。项目需求包括客户画像、消费统计、资源利用率、特征人群定位和数据可视化。数据源包括Customer、Transaction、Store和Review四张表,涉及多个维度的聚合和分析,如按性别、国家统计客户、按时间段计算总收入等。项目执行需先下载数据和配置Zeppelin环境,然后通过Hive进行数据清洗、建表和分析。在建表过程中,涉及ODS、DWD、DWT、DWS和DM五层,每层都有其特定的任务和粒度。最后,通过Hive SQL进行各种业务指标的计算和分析。
1163 1
Hive实战 —— 电商数据分析(全流程详解 真实数据)