hive窗口函数应用
Posted Hadoop大数据之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive窗口函数应用相关的知识,希望对你有一定的参考价值。
前面的文章、中已经对hive的技术原理及性能调优进行了较为详细的说明,从前面的文章可知,hive是一个海量结构化数据存储的数据仓库,基于MapReduce计算框架进行数据计算,非常适合用于海量数据的多维离线分析,并且可以通过类SQL语句(HQL)来实现数据的分析,HQL语法与传统关系型数据库的SQL语法非常接近,对有SQL经验的开发者来说非常容易上手。在实际应用开发中,往往会遇到这样的问题:对某一片分区并且有序排列的数据进行累计求和、最大/小值、平均值等分析,用group by、sort by等聚合函数无法解决,需要自定义UDF函数?答案是:可以通过over()窗口函数实现对分区有序的数据分析。
一、窗口函数语法
ROWS between CURRENT ROW|UNBOUNDED PRECEDING|[num] PRECEDING AND UNBOUNDED FOLLOWING|[num] FOLLOWING|CURRENT ROW
或
RANGE between [num] PRECEDING AND [num] FOLLOWING
如下图:
ROWS是物理窗口,从行数上控制窗口的尺寸
RANGE是逻辑窗口,从列值上控制窗口的尺寸,即基于当前物理行逻辑位置,如果不指定窗口子句,则默认为:range between unbounded preceding and current row
PRECEDING是当前行的前置逻辑位置
FOLLOWING是当前行的后置逻辑位置
二、分析及排名函数
lag(field, N, default)是取第前N行的值,default为当取值为NULL时的默认值;
lead(field, N, default)是取第后N行的值,default为当取值为NULL时的默认值;
first_value(field)取分组内排序后,截止到当前行第一个值;
last_value(field)取分组内排序后,截止到当前行最后一个值;
dense_rank()排名函数,连续排名;
rank()排名函数,遇到排名并列时,下一列排名跳空;
percent_rank()介于0和1之间的小数形式表示,计算方法是(rank-1)/(n-1),其中rank为行的序号,n为组的行数;
row_number()依次排序且序号不会重复;
ntile()可以对序号进行分组处理,将有序分区中的行分发到指定数目的组中。各组有编号,编号从一开始。对于每一行,ntile将返回此行所属的组的编号;
三、案例分析
需求:统计同一用户相邻订单时间差、平均订购时间间隔及2分钟内订购订单数量。
分析过程:从指标口径的理解可知,采用全局聚合函数是无法适用于当前场景的,只要先把同一用户相邻订单时间差指标计算出来,便可得出平均订购时间间隔、2分钟内订购订单数量指标结果。首先需要对所有的订单记录按照用户进行分区处理,然后对订购时间进行升序排序,最后用当前行的订购时间减去当前行的前1行的订购时间即可计算出相邻订单时间差。
HQL:
select concat(substr(t2.feemsisdn, 0, 1), '*', substr(t2.feemsisdn, -1, 1)) feemsisdn,
t2.timesub,
avg(t2.timesub) over(partition by t2.feemsisdn order by t2.cdrtime) avg_timesub,
sum(case when t2.timesub<=120 then 1 else 0 end) over(partition by t2.feemsisdn order by t2.cdrtime) 2min_num
from (
select t1.feemsisdn, t1.cdrtime, cdrtime-unix_timestamp(t1.last_cdrtime, 'yyyyMMddHHmmss') timesub
from (
select
feemsisdn,
unix_timestamp(cdrtime, 'yyyyMMddHHmmss') cdrtime,
lag(cdrtime, 1) over(partition by feemsisdn order by cdrtime) last_cdrtime
from ods_mm_cssp_cdr
where day between date_sub('2018-03-01', 90) and '2018-03-01'
) t1
) t2;
结果:
总结:
1、partitioned by ... order by ...可以通过distributed by ... sort by ...代替;
2、四个排名函数(rank、dense_rank、row_number、ntile);
3、排名函数必须有OVER子句;
4、排名函数必须有包含ORDER BY子句;
5、开窗函数分析对资源消耗较大;
以上是关于hive窗口函数应用的主要内容,如果未能解决你的问题,请参考以下文章