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作为前一行的结束 ...
随机推荐
- 子元素的margin-top会影响父元素
---恢复内容开始--- 之前在写项目的时候,发现原本想让父子元素之间加点边距,却让父元素产生了margin-top,于是百度之后发现了原因. 在css2.1盒模型中 In this specific ...
- click事件的累加绑定
click事件的累加绑定,绑定一次点击事件,执行多次. 在页面中为一个元素绑定事件,事件执行后页面未刷新且元素还在,然后你再次点击,元素又被绑定一个点击事件,这样第二次点击就会执行两次,以此类推. 如 ...
- 零基础逆向工程25_C++_02_类的成员权限_虚函数_模板
1 类的成员权限 1.1 小结: 1.对外提供的函数或者变量,发布成public的 但不能随意改动. 2.可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测. 3.只有结 ...
- Python学习-用户输入和字符串拼接
用户输入和字符串拼接 #用户输入和字符串拼接username=input("username:")age=int(input("Age:")) #转换整数型 ...
- 飞塔NGFW-FortiGate-5.2(BYOL)
平台: FortiGate 类型: 虚拟机镜像 软件包: basic software FortiGate ips security UTM vpn 反垃圾邮件 网页过滤 服务优惠价: 按服务商许可协 ...
- 第1章 .Net应用程序体系结构
1. CLR:公共语言运行库,是每种.Net编程语言都使用的运行库 Windows 8为Windows Store应用程序引入了一个新的编程接口:Windows运行库. C# 6 具有许多小而实用的语 ...
- Http协议--请求报文和响应报文
http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应 ...
- 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)
点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...
- 关于profile集合
profile集合是mongodb的慢操作日志 > db.getProfilingStatus() { , , } 可以通过getProfilingStatus来查看当前profile设置 pr ...
- solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...