• Hive 分析函数lead、lag实例应用


    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数据表,表结构如下:
    [sql] view plain copy
     
    1. create table test.user_log(  
    2.     userid string,  
    3.     time string,  
    4.     url string  
    5. ) row format delimited fields terminated by ',';  
    记录数据:
    [plain] view plain copy
     
    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. +------------------+----------------------+---------------+--+  

    分析步骤

    获取用户在某个页面停留的起始与结束时间
    [sql] view plain copy
     
    1. select userid,  
    2.        time stime,  
    3.        lead(time) over(partition by userid order by time) etime,  
    4.        url   
    5.   from test.user_log;  
    结果:
    [plain] view plain copy
     
    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个小时,那这条记录肯定是不可取的。)
    [sql] view plain copy
     
    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;  
    结果:
    [sql] view plain copy
     
    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. +---------+----------------------+----------------------+---------+-------+--+  

    计算每个页面停留的总时间,某个用户访问某个页面的总时间
    [sql] view plain copy
     
    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;  
    结果:
    [plain] view plain copy
     
    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. +-------+---------+---------------+--+  
  • 相关阅读:
    JUnit常用断言及注解
    centos7 yum快速安装LNMP
    ceph问题汇总
    selinux介绍/状态查看/开启/关闭
    linux 修改主机名
    CentOS 7部署 Ceph分布式存储架构
    如何判断当前系统运行在物理机上还是虚拟机上,返回虚拟机的类型
    Golang操作结构体、Map转化为JSON
    PHP强制修改返回的状态码
    composer问题集锦
  • 原文地址:https://www.cnblogs.com/hd-zg/p/5947337.html
Copyright © 2020-2023  润新知