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. jar 压缩 解压 war包

    Win+R 输入cmd进入命令行,进入到源码所在目录.所用工具,jdk自带的jar.exe 打包命令:jar -cvf xxx.war * 解包命令: jar -xvf xxx.war * 参数 说明 ...

  2. Compaq Visual Fortran生成静态库的方法及使用

    Compaq Visual Fortran 6.5生成lib静态库详细方法: 打开Compaq Visual Fortran,新建Fortran Static Library工程,命名为ForLib: ...

  3. WPF样式学习:ToolBar的使用

    隐藏拖动把手: 设置ToolBar属性 ToolBarTray.IsLocked="True",可以达到隐藏拖动把手的目的 private void ToolBar_Loaded( ...

  4. grafana快速入门

    入门 本指南将帮助您开始并熟悉Grafana.它假定您有一台正在运行的Grafana服务器,并至少添加了一个数据源. 初学者指南 观看10分钟的初学者指南,以建立仪表板,以快速介绍设置仪表板和面板. ...

  5. A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

  6. LeetCode Minimum Depth of Binary Tree 找最小深度(返回最小深度)

    题意:找到离根结点最近的叶子结点的那一层(设同一层上的结点与根结点的距离相等),返回它所在的层数. 方法有: 1.递归深度搜索 2.层次搜索 方法一:递归(无优化) /** * Definition ...

  7. 可以让表格变为拖动边界调整列宽度的JS办法

    需要引入文件: jquery.resizableColumns.min.js 和 jquery.resizableColumns.css 代码如下: $(".tableclass" ...

  8. http头部信息学习

    想的每2周进行知识的总结,自己拖延症有犯了,发现自己知识库量还是太少,平时总结和发现问题还不够深,对待问题的深度也存在很多问题,但是坚持学习,总结,后面应该会有收获, 1.常见的返回码 100: 请服 ...

  9. World Wind Java开发之三 显示状态栏信息(转)

    http://blog.csdn.net/giser_whu/article/details/40920315 先来看下本篇博客索要达到的效果: 找到源码下的gov.nasa.worldwind.ut ...

  10. UVA 1642 Magical GCD(gcd的性质,递推)

    分析:对于区间[i,j],枚举j. 固定j以后,剩下的要比较M_gcd(k,j) = gcd(ak,...,aj)*(j-k+1)的大小, i≤k≤j. 此时M_gcd(k,j)可以看成一个二元组(g ...