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窗口函数应用的主要内容,如果未能解决你的问题,请参考以下文章

hive窗口函数总结

hive关于窗口函数的使用

数据仓库工具Hive——窗口函数,DML,事务

Hive sql及窗口函数

大数据技术-hive窗口函数详解

Hive学习窗口函数源码阅读