Hive 分析函数lead、lag实例应用
Hive的分析函数又叫窗口函数,在oracle中就有这样的分析函数,主要用来做数据统计分析的。
这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率,其中over()表示当前查询的结果集对象,括号里面的语句则表示对这个结果集进行处理。
函数介绍
LAG
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
参数1为列名,参数2为往上第n行(可选,默认为1),参数3为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
LEAD
与LAG相反
LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值
参数1为列名,参数2为往下第n行(可选,默认为1),参数3为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
场景
问题
用户Peter在浏览网页,在某个时刻,Peter点进了某个页面,过一段时间后,Peter又进入了另外一个页面,如此反复,那怎么去统计Peter在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?
数据准备
- create table test.user_log(
- userid string,
- time string,
- url string
- ) row format delimited fields terminated by ',';
记录数据:
- +------------------+----------------------+---------------+--+
- | user_log.userid | user_log.time | user_log.url |
- +------------------+----------------------+---------------+--+
- | Peter | 2015-10-12 01:10:00 | url1 |
- | Peter | 2015-10-12 01:15:10 | url2 |
- | Peter | 2015-10-12 01:16:40 | url3 |
- | Peter | 2015-10-12 02:13:00 | url4 |
- | Peter | 2015-10-12 03:14:30 | url5 |
- | Marry | 2015-11-12 01:10:00 | url1 |
- | Marry | 2015-11-12 01:15:10 | url2 |
- | Marry | 2015-11-12 01:16:40 | url3 |
- | Marry | 2015-11-12 02:13:00 | url4 |
- | Marry | 2015-11-12 03:14:30 | url5 |
- +------------------+----------------------+---------------+--+
分析步骤
获取用户在某个页面停留的起始与结束时间
- select userid,
- time stime,
- lead(time) over(partition by userid order by time) etime,
- url
- from test.user_log;
结果:
- +---------+----------------------+----------------------+-------+--+
- | userid | stime | etime | url |
- +---------+----------------------+----------------------+-------+--+
- | Marry | 2015-11-12 01:10:00 | 2015-11-12 01:15:10 | url1 |
- | Marry | 2015-11-12 01:15:10 | 2015-11-12 01:16:40 | url2 |
- | Marry | 2015-11-12 01:16:40 | 2015-11-12 02:13:00 | url3 |
- | Marry | 2015-11-12 02:13:00 | 2015-11-12 03:14:30 | url4 |
- | Marry | 2015-11-12 03:14:30 | NULL | url5 |
- | Peter | 2015-10-12 01:10:00 | 2015-10-12 01:15:10 | url1 |
- | Peter | 2015-10-12 01:15:10 | 2015-10-12 01:16:40 | url2 |
- | Peter | 2015-10-12 01:16:40 | 2015-10-12 02:13:00 | url3 |
- | Peter | 2015-10-12 02:13:00 | 2015-10-12 03:14:30 | url4 |
- | Peter | 2015-10-12 03:14:30 | NULL | url5 |
- +---------+----------------------+----------------------+-------+--+
计算用户在页面停留的时间间隔(实际分析当中,这里要做数据清洗工作,如果一个用户停留了4、5个小时,那这条记录肯定是不可取的。)
- select userid,
- time stime,
- lead(time) over(partition by userid order by time) etime,
- UNIX_TIMESTAMP(lead(time) over(partition by userid order by time),'yyyy-MM-dd HH:mm:ss')- UNIX_TIMESTAMP(time,'yyyy-MM-dd HH:mm:ss') period,
- url
- from test.user_log;
结果:
- +---------+----------------------+----------------------+---------+-------+--+
- | userid | stime | etime | period | url |
- +---------+----------------------+----------------------+---------+-------+--+
- | Marry | 2015-11-12 01:10:00 | 2015-11-12 01:15:10 | 310 | url1 |
- | Marry | 2015-11-12 01:15:10 | 2015-11-12 01:16:40 | 90 | url2 |
- | Marry | 2015-11-12 01:16:40 | 2015-11-12 02:13:00 | 3380 | url3 |
- | Marry | 2015-11-12 02:13:00 | 2015-11-12 03:14:30 | 3690 | url4 |
- | Marry | 2015-11-12 03:14:30 | NULL | NULL | url5 |
- | Peter | 2015-10-12 01:10:00 | 2015-10-12 01:15:10 | 310 | url1 |
- | Peter | 2015-10-12 01:15:10 | 2015-10-12 01:16:40 | 90 | url2 |
- | Peter | 2015-10-12 01:16:40 | 2015-10-12 02:13:00 | 3380 | url3 |
- | Peter | 2015-10-12 02:13:00 | 2015-10-12 03:14:30 | 3690 | url4 |
- | Peter | 2015-10-12 03:14:30 | NULL | NULL | url5 |
- +---------+----------------------+----------------------+---------+-------+--+
计算每个页面停留的总时间,某个用户访问某个页面的总时间
- select nvl(url,'-1') url,
- nvl(userid,'-1') userid,
- sum(period) totol_peroid from (
- select userid,
- time stime,
- lead(time) over(partition by userid order by time) etime,
- UNIX_TIMESTAMP(lead(time) over(partition by userid order by time),'yyyy-MM-dd HH:mm:ss')- UNIX_TIMESTAMP(time,'yyyy-MM-dd HH:mm:ss') period,
- url
- from test.user_log
- ) a group by url, userid with rollup;
结果:
- +-------+---------+---------------+--+
- | url | userid | totol_peroid |
- +-------+---------+---------------+--+
- | -1 | -1 | 14940 |
- | url1 | -1 | 620 |
- | url1 | Marry | 310 |
- | url1 | Peter | 310 |
- | url2 | -1 | 180 |
- | url2 | Marry | 90 |
- | url2 | Peter | 90 |
- | url3 | -1 | 6760 |
- | url3 | Marry | 3380 |
- | url3 | Peter | 3380 |
- | url4 | -1 | 7380 |
- | url4 | Marry | 3690 |
- | url4 | Peter | 3690 |
- | url5 | -1 | NULL |
- | url5 | Marry | NULL |
- | url5 | Peter | NULL |
- +-------+---------+---------------+--+
Hive 分析函数lead、lag实例应用的更多相关文章
- Hive 窗口函数LEAD LAG FIRST_VALUE LAST_VALUE
窗口函数(window functions)对多行进行操作,并为查询中的每一行返回一个值. OVER()子句能将窗口函数与其他分析函数(analytical functions)和报告函数(repor ...
- oracle函数中lead,lag,over,partition by 的使用
lead,lag函数的分析 http://blog.csdn.net/mazongqiang/article/details/7621328 举例如下: SQL> select * from ...
- Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法
一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...
- 大数据学习day28-----hive03------1. null值处理,子串,拼接,类型转换 2.行转列,列转行 3. 窗口函数(over,lead,lag等函数) 4.rank(行号函数)5. json解析函数 6.jdbc连接hive,企业级调优
1. null值处理,子串,拼接,类型转换 (1) 空字段赋值(null值处理) 当表中的某个字段为null时,比如奖金,当你要统计一个人的总工资时,字段为null的值就无法处理,这个时候就可以使用N ...
- Oracle 分析函数之 lag和lead
Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率. /*语法*/ ...
- oracle 列相减——(Oracle分析函数Lead(),Lag())
lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...
- oracle listagg函数、lag函数、lead函数 实例
Oracle大师Thomas Kyte在他的经典著作中,反复强调过一个实现需求方案选取顺序: “如果你可以使用一句SQL解决的需求,就使用一句SQL:如果不可以,就考虑PL/SQL是否可以:如果PL/ ...
- over 分析函数之 lag() lead()
/*语法*/ lag(exp_str,offset,defval) over() 取前 Lead(exp_str,offset,defval) over() 取后 --exp_str要取的列 -- ...
- Oracle Sql优化之lead,lag分析函数
1.表中有四个字段:人员编号,开始时间,结束时间,类型,数据ID,需要实现如下需求 a.当类型为-1时,丢弃该记录 b.当类型为-1时,且前一行结束时间为null,当前行的开始时间-1作为前一行的结束 ...
随机推荐
- 《C#高效编程》读书笔记03-推荐使用is或as操作符而不是强制类型转换
在日常编码中,很多时候都要编写接受object作为参数的方法,接下来是将这些object转型成特定类型,要么类,要么接口.这时我们有两种选择,使用as操作符,或者使用强制类型转换. 正确的做法是,尽可 ...
- Oracle单行函数。。。
单行函数 --字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') spa ...
- 用C++/CLI搭建C++和C#之间的桥梁
一.简单用法 C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于 ...
- Mac 颜色取值
command+shift+4 截图,我靠,我以前不知道 系统自带数码测色计, 选择显示十六位制 command+L 锁定 command+shift+c 复制 简直太方便
- 微信iOS端无法执行jquery on()方法
微信iOS端无法执行jquery on()方法,click方法可以, 如下代码是不会执行的: $(function(){ $('body').on('click','.cka',function(){ ...
- 命令行启动mysql服务
在<计算机网络>课程中曾学过net命令,可以用于启动后台服务.在mysql中,net命令用于启动后台服务器进程mysqld,即后台服务. 不过,如果在普通用户模式下net start my ...
- linux 命令——37 date (转)
在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...
- Project Euler 第一题效率分析
Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
- constraint的一些用法总结
主要就是增加约束的 以下几种约束 .并 一一列举: 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束:就是对一个列进行了约束,约束为(非空.不重复) 以下是代码 ...
- 【BZOJ1562】[NOI2009] 变换序列(匈牙利算法)
点此看题面 大致题意: 给你一个长度为\(n\)的序列\(D\),让你找到一个字典序最小的\(n\)的排列\(T\),满足\(D_i=min(|T_i-i|,n-|T_i-i|)\). 建图 我想建图 ...