Hive的分析函数又叫窗口函数,在oracle中就有这样的分析函数,主要用来做数据统计分析的。

Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
这种操作可以代替表的自联接,并且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在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?

数据准备

现在用户的行为都被采集了,处理转换到hive数据表,表结构如下:
  1. create table test.user_log(
  2. userid string,
  3. time string,
  4. url string
  5. ) row format delimited fields terminated by ',';

记录数据:

  1. +------------------+----------------------+---------------+--+
  2. | user_log.userid  |    user_log.time     | user_log.url  |
  3. +------------------+----------------------+---------------+--+
  4. | Peter            | 2015-10-12 01:10:00  | url1          |
  5. | Peter            | 2015-10-12 01:15:10  | url2          |
  6. | Peter            | 2015-10-12 01:16:40  | url3          |
  7. | Peter            | 2015-10-12 02:13:00  | url4          |
  8. | Peter            | 2015-10-12 03:14:30  | url5          |
  9. | Marry            | 2015-11-12 01:10:00  | url1          |
  10. | Marry            | 2015-11-12 01:15:10  | url2          |
  11. | Marry            | 2015-11-12 01:16:40  | url3          |
  12. | Marry            | 2015-11-12 02:13:00  | url4          |
  13. | Marry            | 2015-11-12 03:14:30  | url5          |
  14. +------------------+----------------------+---------------+--+

分析步骤

获取用户在某个页面停留的起始与结束时间

  1. select userid,
  2. time stime,
  3. lead(time) over(partition by userid order by time) etime,
  4. url
  5. from test.user_log;

结果:

  1. +---------+----------------------+----------------------+-------+--+
  2. | userid  |        stime         |        etime         |  url  |
  3. +---------+----------------------+----------------------+-------+--+
  4. | Marry   | 2015-11-12 01:10:00  | 2015-11-12 01:15:10  | url1  |
  5. | Marry   | 2015-11-12 01:15:10  | 2015-11-12 01:16:40  | url2  |
  6. | Marry   | 2015-11-12 01:16:40  | 2015-11-12 02:13:00  | url3  |
  7. | Marry   | 2015-11-12 02:13:00  | 2015-11-12 03:14:30  | url4  |
  8. | Marry   | 2015-11-12 03:14:30  | NULL                 | url5  |
  9. | Peter   | 2015-10-12 01:10:00  | 2015-10-12 01:15:10  | url1  |
  10. | Peter   | 2015-10-12 01:15:10  | 2015-10-12 01:16:40  | url2  |
  11. | Peter   | 2015-10-12 01:16:40  | 2015-10-12 02:13:00  | url3  |
  12. | Peter   | 2015-10-12 02:13:00  | 2015-10-12 03:14:30  | url4  |
  13. | Peter   | 2015-10-12 03:14:30  | NULL                 | url5  |
  14. +---------+----------------------+----------------------+-------+--+

计算用户在页面停留的时间间隔(实际分析当中,这里要做数据清洗工作,如果一个用户停留了4、5个小时,那这条记录肯定是不可取的。)

  1. select userid,
  2. time stime,
  3. lead(time) over(partition by userid order by time) etime,
  4. 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,
  5. url
  6. from test.user_log;

结果:

  1. +---------+----------------------+----------------------+---------+-------+--+
  2. | userid  |        stime         |        etime         | period  |  url  |
  3. +---------+----------------------+----------------------+---------+-------+--+
  4. | Marry   | 2015-11-12 01:10:00  | 2015-11-12 01:15:10  | 310     | url1  |
  5. | Marry   | 2015-11-12 01:15:10  | 2015-11-12 01:16:40  | 90      | url2  |
  6. | Marry   | 2015-11-12 01:16:40  | 2015-11-12 02:13:00  | 3380    | url3  |
  7. | Marry   | 2015-11-12 02:13:00  | 2015-11-12 03:14:30  | 3690    | url4  |
  8. | Marry   | 2015-11-12 03:14:30  | NULL                 | NULL    | url5  |
  9. | Peter   | 2015-10-12 01:10:00  | 2015-10-12 01:15:10  | 310     | url1  |
  10. | Peter   | 2015-10-12 01:15:10  | 2015-10-12 01:16:40  | 90      | url2  |
  11. | Peter   | 2015-10-12 01:16:40  | 2015-10-12 02:13:00  | 3380    | url3  |
  12. | Peter   | 2015-10-12 02:13:00  | 2015-10-12 03:14:30  | 3690    | url4  |
  13. | Peter   | 2015-10-12 03:14:30  | NULL                 | NULL    | url5  |
  14. +---------+----------------------+----------------------+---------+-------+--+

计算每个页面停留的总时间,某个用户访问某个页面的总时间

  1. select nvl(url,'-1') url,
  2. nvl(userid,'-1') userid,
  3. sum(period) totol_peroid from (
  4. select userid,
  5. time stime,
  6. lead(time) over(partition by userid order by time) etime,
  7. 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,
  8. url
  9. from test.user_log
  10. ) a group by url, userid with rollup;

结果:

  1. +-------+---------+---------------+--+
  2. |  url  | userid  | totol_peroid  |
  3. +-------+---------+---------------+--+
  4. | -1    | -1      | 14940         |
  5. | url1  | -1      | 620           |
  6. | url1  | Marry   | 310           |
  7. | url1  | Peter   | 310           |
  8. | url2  | -1      | 180           |
  9. | url2  | Marry   | 90            |
  10. | url2  | Peter   | 90            |
  11. | url3  | -1      | 6760          |
  12. | url3  | Marry   | 3380          |
  13. | url3  | Peter   | 3380          |
  14. | url4  | -1      | 7380          |
  15. | url4  | Marry   | 3690          |
  16. | url4  | Peter   | 3690          |
  17. | url5  | -1      | NULL          |
  18. | url5  | Marry   | NULL          |
  19. | url5  | Peter   | NULL          |
  20. +-------+---------+---------------+--+

Hive 分析函数lead、lag实例应用的更多相关文章

  1. Hive 窗口函数LEAD LAG FIRST_VALUE LAST_VALUE

    窗口函数(window functions)对多行进行操作,并为查询中的每一行返回一个值. OVER()子句能将窗口函数与其他分析函数(analytical functions)和报告函数(repor ...

  2. oracle函数中lead,lag,over,partition by 的使用

    lead,lag函数的分析 http://blog.csdn.net/mazongqiang/article/details/7621328 举例如下: SQL> select *  from ...

  3. Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法

    一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...

  4. 大数据学习day28-----hive03------1. null值处理,子串,拼接,类型转换 2.行转列,列转行 3. 窗口函数(over,lead,lag等函数) 4.rank(行号函数)5. json解析函数 6.jdbc连接hive,企业级调优

    1. null值处理,子串,拼接,类型转换 (1) 空字段赋值(null值处理) 当表中的某个字段为null时,比如奖金,当你要统计一个人的总工资时,字段为null的值就无法处理,这个时候就可以使用N ...

  5. Oracle 分析函数之 lag和lead

    Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率. /*语法*/   ...

  6. oracle 列相减——(Oracle分析函数Lead(),Lag())

    lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...

  7. oracle listagg函数、lag函数、lead函数 实例

    Oracle大师Thomas Kyte在他的经典著作中,反复强调过一个实现需求方案选取顺序: “如果你可以使用一句SQL解决的需求,就使用一句SQL:如果不可以,就考虑PL/SQL是否可以:如果PL/ ...

  8. over 分析函数之 lag() lead()

    /*语法*/ lag(exp_str,offset,defval) over()  取前 Lead(exp_str,offset,defval) over()  取后 --exp_str要取的列 -- ...

  9. Oracle Sql优化之lead,lag分析函数

    1.表中有四个字段:人员编号,开始时间,结束时间,类型,数据ID,需要实现如下需求 a.当类型为-1时,丢弃该记录 b.当类型为-1时,且前一行结束时间为null,当前行的开始时间-1作为前一行的结束 ...

随机推荐

  1. 《C#高效编程》读书笔记03-推荐使用is或as操作符而不是强制类型转换

    在日常编码中,很多时候都要编写接受object作为参数的方法,接下来是将这些object转型成特定类型,要么类,要么接口.这时我们有两种选择,使用as操作符,或者使用强制类型转换. 正确的做法是,尽可 ...

  2. Oracle单行函数。。。

    单行函数 --字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') spa ...

  3. 用C++/CLI搭建C++和C#之间的桥梁

    一.简单用法 C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于 ...

  4. Mac 颜色取值

    command+shift+4  截图,我靠,我以前不知道 系统自带数码测色计, 选择显示十六位制 command+L 锁定 command+shift+c 复制 简直太方便

  5. 微信iOS端无法执行jquery on()方法

    微信iOS端无法执行jquery on()方法,click方法可以, 如下代码是不会执行的: $(function(){ $('body').on('click','.cka',function(){ ...

  6. 命令行启动mysql服务

    在<计算机网络>课程中曾学过net命令,可以用于启动后台服务.在mysql中,net命令用于启动后台服务器进程mysqld,即后台服务. 不过,如果在普通用户模式下net start my ...

  7. linux 命令——37 date (转)

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  8. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

  9. constraint的一些用法总结

    主要就是增加约束的 以下几种约束 .并 一一列举: 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束:就是对一个列进行了约束,约束为(非空.不重复) 以下是代码  ...

  10. 【BZOJ1562】[NOI2009] 变换序列(匈牙利算法)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(D\),让你找到一个字典序最小的\(n\)的排列\(T\),满足\(D_i=min(|T_i-i|,n-|T_i-i|)\). 建图 我想建图 ...