hive常用窗口函数

1 hive窗口函数

在平时的开发中常用那些hive函数??

1、字符串操作函数?split、concat、ifnull、cast
2、聚合函数 : hive适用于分析,所以常用。
3、时间函数 : 数仓的特征随时间变化而变化,所以时间也特别多

哪窗口函数到底是什么鬼??
hive中窗口函数是聚合函数的增强实现,是针对分组后,还需要对组内的每行数据返回一个对应的统计值。而这个聚合函数很难做到,聚合函数是一旦聚合就只能一个组返回一个值。

1.1 窗口函数列举

sum(col) over() :  分组对col累计求和,over() 中的语法如下
count(col) over() : 分组对col累计,over() 中的语法如下
min(col) over() : 分组对col求最小
max(col) over() : 分组求col的最大值
avg(col) over() : 分组求col列的平均值
first_value(col) over() : 某分区排序后的第一个col值
last_value(col) over() : 某分区排序后的最后一个col值
lag(col,n,DEFAULT) : 统计往前n行的col值,n可选,默认为1,DEFAULT当往上第n行为NULL时候,取默认值,如不指定,则为NULL
lead(col,n,DEFAULT) : 统计往后n行的col值,n可选,默认为1,DEFAULT当往下第n行为NULL时候,取默认值,如不指定,则为NULL
ntile(n) : 用于将分组数据按照顺序切分成n片,返回当前切片值。注意:n必须为int类型。

排名函数:
row_number() over() : 排名函数,不会重复,适合于生成主键或者不并列排名
rank() over() :  排名函数,有并列名次,名次不连续。如:1,1,3
dense_rank() over() : 排名函数,有并列名次,名次连续。如:1,1,2

重点语法:
主要是 over(分组 排序 窗口) 中的order by后的语法。物理和逻辑窗口具体语法如下:

1.1.1 、物理窗口(真实往上下移动多少行rows between)

CURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING AND UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW

如: over(partition by col order by rows between 1 preceding and 1 fllowing)

在这里插入图片描述

1.1.2、 逻辑窗口(满足条件上下多少行)

range between [num] PRECEDING AND [num] FOLLOWING

如: over(partition by col order by range between 5 preceding and 5 fllowing)

在这里插入图片描述

注意:窗口函数一般不和group by搭配使用。

应用:
某天某产品的累计销售额。

物理窗口:

求累计即可(累计退款金额、累计交易额、累计订单数量)

逻辑窗口:

范围累计环比情况、某值上下加减。

1.1.2 编写sql实现每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数

数据:
userid,month,visits
A,2015‐01,5
A,2015‐01,15
B,2015‐01,5
A,2015‐01,8
B,2015‐01,25
A,2015‐01,5
A,2015‐02,4
A,2015‐02,6
B,2015‐02,10
B,2015‐02,5
A,2015‐03,16
A,2015‐03,22
B,2015‐03,23
B,2015‐03,10
B,2015‐03,1

每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数,结果数据格式如下:

在这里插入图片描述

1.1.3 窗口函数案例:

create table visits(
userid string,
month string,
visits int
)
row format delimited fields terminated by ','
;

load data local inpath '/home/visits' into table visits;


select
t.userid,
t.month,
max(visits) over(distribute by t.userid sort by t.month) max_visits,
sum(visits) over(distribute by t.userid sort by t.month) total_visits,
t.visits
from (select
vs.userid,
vs.month,
sum(visits) visits
from visits vs
group by vs.userid,vs.month) t
;


结果:
OK
A       2015‐01 33      33      33
A       2015‐02 33      43      10
A       2015‐03 38      81      38
B       2015‐01 30      30      30
B       2015‐02 30      45      15
B       2015‐03 34      79      34


性能分析:
1、月份转换成成时间戳更好
2、子查询不会限制性能,相反更好。

1.2 窗口函数和聚合函数区别

返回值区别:
聚合函数:1个分组对应一个返回值。
窗口函数:1个分组中的每行数据,对应一个返回值。

场景区别:
聚合函数:用于分组统计。
窗口函数:用于组内统计,多用于组内排名、累计统计、前后范围统计。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章