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 HIVE
hive高频函数(一)
hive高频函数(一)
22 0
|
23天前
|
SQL 数据采集 数据可视化
基于Hive的招聘网站的大数据分析系统
基于Hive的招聘网站的大数据分析系统
|
23天前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
|
2月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
43 2
Hive函数全解——思维导图 + 七种函数类型
|
2月前
|
SQL 数据采集 存储
Hive实战 —— 电商数据分析(全流程详解 真实数据)
关于基于小型数据的Hive数仓构建实战,目的是通过分析某零售企业的门店数据来进行业务洞察。内容涵盖了数据清洗、数据分析和Hive表的创建。项目需求包括客户画像、消费统计、资源利用率、特征人群定位和数据可视化。数据源包括Customer、Transaction、Store和Review四张表,涉及多个维度的聚合和分析,如按性别、国家统计客户、按时间段计算总收入等。项目执行需先下载数据和配置Zeppelin环境,然后通过Hive进行数据清洗、建表和分析。在建表过程中,涉及ODS、DWD、DWT、DWS和DM五层,每层都有其特定的任务和粒度。最后,通过Hive SQL进行各种业务指标的计算和分析。
376 1
Hive实战 —— 电商数据分析(全流程详解 真实数据)
|
2月前
|
SQL 分布式计算 HIVE
Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!
在Hive 3.1.2和Spark 3.0.2集群环境中,遇到`dayofweek`函数bug。当`create_date`为字符串类型时,`dayofweek`函数结果错位。修复方法是将`create_date`转换为`date`类型。在Spark SQL中,原始代码能正常运行,未出现此问题。因此建议在Hive中使用转换后的日期类型以避免错误。
|
2月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
2月前
|
SQL HIVE UED
【Hive SQL 每日一题】分析电商平台的用户行为和订单数据
作为一名数据分析师,你需要分析电商平台的用户行为和订单数据。你有三张表:`users`(用户信息),`orders`(订单信息)和`order_items`(订单商品信息)。任务包括计算用户总订单金额和数量,按月统计订单,找出最常购买的商品,找到平均每月最高订单金额和数量的用户,以及分析高消费用户群体的年龄和性别分布。通过SQL查询,你可以实现这些分析,例如使用`GROUP BY`、`JOIN`和窗口函数来排序和排名。
|
2月前
|
SQL Java 程序员
Hive反射函数的使用-程序员是怎么学UDF函数的
Hive反射函数的使用-程序员是怎么学UDF函数的
15 0
|
2月前
|
SQL HIVE 数据格式
Hive高频函数(二)
Hive高频函数(二)
22 0