热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Hive分析窗口函数(四)LAG,LEAD,FIRST_VALUE,LAST_VALUE

1.LAG功能是什么?2.LEAD与LAG功能有什么相的地方那个?3.FIRST_VALUE与LAST_VALUE分别完成什么功能?继续学习这四个分析函数。注意:这几个函数不支持WINDOW子句。Hive版本为apache-hive-0.13.1数据准备:水电费cookie1,2015-04-1010:00:02,url2

1.LAG功能是什么? 2.LEAD与LAG功能有什么相的地方那个? 3.FIRST_VALUE与LAST_VALUE分别完成什么功能? 继续学习这四个分析函数。注意: 这几个函数不支持WINDOW子句。 Hive版本为 apache-hive-0.13.1 数据准备: 水电费 COOKIE1,2015-04-10 10:00:02,url2

1.LAG功能是什么?
2.LEAD与LAG功能有什么相似的地方那个?

3.FIRST_VALUE与LAST_VALUE分别完成什么功能?


继续学习这四个分析函数。 注意: 这几个函数不支持WINDOW子句。 Hive版本为 apache-hive-0.13.1 数据准备:

水电费

    COOKIE1,2015-04-10 10:00:02,url2
    COOKIE1,2015-04-10 10:00:00,url1
    COOKIE1,2015-04-10 10:03:04,1url3
    COOKIE1,2015-04-10 10:50:05,url6
    COOKIE1,2015-04-10 11:00:00,url7
    COOKIE1,2015-04-10 10:10:00,url4
    COOKIE1,2015-04-10 10:50:01,url5
    COOKIE2,2015-04-10 10:00:02,url22
    COOKIE2,2015-04-10 10:00:00,url11
    COOKIE2,2015-04-10 10:03:04,1url33
    COOKIE2,2015-04-10 10:50:05,url66
    COOKIE2,2015-04-10 11:00:00,url77
    COOKIE2,2015-04-10 10:10:00,url44
    COOKIE2,2015-04-10 10:50:01,url55

    CREATE EXTERNAL TABLE lxw1234 (
    COOKIEid string,
    createtime string,  --页面访问时间
    url STRING       --被访问页面
    ) ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    stored as textfile location '/tmp/lxw11/';


    hive> select * from lxw1234;
    OK
    COOKIE1 2015-04-10 10:00:02     url2
    COOKIE1 2015-04-10 10:00:00     url1
    COOKIE1 2015-04-10 10:03:04     1url3
    COOKIE1 2015-04-10 10:50:05     url6
    COOKIE1 2015-04-10 11:00:00     url7
    COOKIE1 2015-04-10 10:10:00     url4
    COOKIE1 2015-04-10 10:50:01     url5
    COOKIE2 2015-04-10 10:00:02     url22
    COOKIE2 2015-04-10 10:00:00     url11
    COOKIE2 2015-04-10 10:03:04     1url33
    COOKIE2 2015-04-10 10:50:05     url66
    COOKIE2 2015-04-10 11:00:00     url77
    COOKIE2 2015-04-10 10:10:00     url44
    COOKIE2 2015-04-10 10:50:01     url55
LAG

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

    SELECT COOKIEid,
    createtime,
    url,
    ROW_NUMBER() OVER(PARTITION BY COOKIEid ORDER BY createtime) AS rn,
    LAG(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY COOKIEid ORDER BY createtime) AS last_1_time,
    LAG(createtime,2) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS last_2_time
    FROM lxw1234;


    COOKIEid createtime             url    rn       last_1_time             last_2_time
    -------------------------------------------------------------------------------------------
    COOKIE1 2015-04-10 10:00:00     url1    1       1970-01-01 00:00:00     NULL
    COOKIE1 2015-04-10 10:00:02     url2    2       2015-04-10 10:00:00     NULL
    COOKIE1 2015-04-10 10:03:04     1url3   3       2015-04-10 10:00:02     2015-04-10 10:00:00
    COOKIE1 2015-04-10 10:10:00     url4    4       2015-04-10 10:03:04     2015-04-10 10:00:02
    COOKIE1 2015-04-10 10:50:01     url5    5       2015-04-10 10:10:00     2015-04-10 10:03:04
    COOKIE1 2015-04-10 10:50:05     url6    6       2015-04-10 10:50:01     2015-04-10 10:10:00
    COOKIE1 2015-04-10 11:00:00     url7    7       2015-04-10 10:50:05     2015-04-10 10:50:01
    COOKIE2 2015-04-10 10:00:00     url11   1       1970-01-01 00:00:00     NULL
    COOKIE2 2015-04-10 10:00:02     url22   2       2015-04-10 10:00:00     NULL
    COOKIE2 2015-04-10 10:03:04     1url33  3       2015-04-10 10:00:02     2015-04-10 10:00:00
    COOKIE2 2015-04-10 10:10:00     url44   4       2015-04-10 10:03:04     2015-04-10 10:00:02
    COOKIE2 2015-04-10 10:50:01     url55   5       2015-04-10 10:10:00     2015-04-10 10:03:04
    COOKIE2 2015-04-10 10:50:05     url66   6       2015-04-10 10:50:01     2015-04-10 10:10:00
    COOKIE2 2015-04-10 11:00:00     url77   7       2015-04-10 10:50:05     2015-04-10 10:50:01


    last_1_time: 指定了往上第1行的值,default为'1970-01-01 00:00:00'  
                 COOKIE1第一行,往上1行为NULL,因此取默认值 1970-01-01 00:00:00
                 COOKIE1第三行,往上1行值为第二行值,2015-04-10 10:00:02
                 COOKIE1第六行,往上1行值为第五行值,2015-04-10 10:50:01
    last_2_time: 指定了往上第2行的值,为指定默认值
                                                     COOKIE1第一行,往上2行为NULL
                                                     COOKIE1第二行,往上2行为NULL
                                                     COOKIE1第四行,往上2行为第二行值,2015-04-10 10:00:02
                                                     COOKIE1第七行,往上2行为第五行值,2015-04-10 10:50:01

LEAD

与LAG相反
LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值
第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

    SELECT COOKIEid,
    createtime,
    url,
    ROW_NUMBER() OVER(PARTITION BY COOKIEid ORDER BY createtime) AS rn,
    LEAD(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY COOKIEid ORDER BY createtime) AS next_1_time,
    LEAD(createtime,2) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS next_2_time
    FROM lxw1234;


    COOKIEid createtime             url    rn       next_1_time             next_2_time
    -------------------------------------------------------------------------------------------
    COOKIE1 2015-04-10 10:00:00     url1    1       2015-04-10 10:00:02     2015-04-10 10:03:04
    COOKIE1 2015-04-10 10:00:02     url2    2       2015-04-10 10:03:04     2015-04-10 10:10:00
    COOKIE1 2015-04-10 10:03:04     1url3   3       2015-04-10 10:10:00     2015-04-10 10:50:01
    COOKIE1 2015-04-10 10:10:00     url4    4       2015-04-10 10:50:01     2015-04-10 10:50:05
    COOKIE1 2015-04-10 10:50:01     url5    5       2015-04-10 10:50:05     2015-04-10 11:00:00
    COOKIE1 2015-04-10 10:50:05     url6    6       2015-04-10 11:00:00     NULL
    COOKIE1 2015-04-10 11:00:00     url7    7       1970-01-01 00:00:00     NULL
    COOKIE2 2015-04-10 10:00:00     url11   1       2015-04-10 10:00:02     2015-04-10 10:03:04
    COOKIE2 2015-04-10 10:00:02     url22   2       2015-04-10 10:03:04     2015-04-10 10:10:00
    COOKIE2 2015-04-10 10:03:04     1url33  3       2015-04-10 10:10:00     2015-04-10 10:50:01
    COOKIE2 2015-04-10 10:10:00     url44   4       2015-04-10 10:50:01     2015-04-10 10:50:05
    COOKIE2 2015-04-10 10:50:01     url55   5       2015-04-10 10:50:05     2015-04-10 11:00:00
    COOKIE2 2015-04-10 10:50:05     url66   6       2015-04-10 11:00:00     NULL
    COOKIE2 2015-04-10 11:00:00     url77   7       1970-01-01 00:00:00     NULL

    --逻辑与LAG一样,只不过LAG是往上,LEAD是往下。

FIRST_VALUE

取分组内排序后,截止到当前行,第一个值

    SELECT COOKIEid,
    createtime,
    url,
    ROW_NUMBER() OVER(PARTITION BY COOKIEid ORDER BY createtime) AS rn,
    FIRST_VALUE(url) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS first1
    FROM lxw1234;

    COOKIEid  createtime            url     rn      first1
    ---------------------------------------------------------
    COOKIE1 2015-04-10 10:00:00     url1    1       url1
    COOKIE1 2015-04-10 10:00:02     url2    2       url1
    COOKIE1 2015-04-10 10:03:04     1url3   3       url1
    COOKIE1 2015-04-10 10:10:00     url4    4       url1
    COOKIE1 2015-04-10 10:50:01     url5    5       url1
    COOKIE1 2015-04-10 10:50:05     url6    6       url1
    COOKIE1 2015-04-10 11:00:00     url7    7       url1
    COOKIE2 2015-04-10 10:00:00     url11   1       url11
    COOKIE2 2015-04-10 10:00:02     url22   2       url11
    COOKIE2 2015-04-10 10:03:04     1url33  3       url11
    COOKIE2 2015-04-10 10:10:00     url44   4       url11
    COOKIE2 2015-04-10 10:50:01     url55   5       url11
    COOKIE2 2015-04-10 10:50:05     url66   6       url11
    COOKIE2 2015-04-10 11:00:00     url77   7       url11

LAST_VALUE

取分组内排序后,截止到当前行,最后一个值


    SELECT COOKIEid,
    createtime,
    url,
    ROW_NUMBER() OVER(PARTITION BY COOKIEid ORDER BY createtime) AS rn,
    LAST_VALUE(url) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS last1
    FROM lxw1234;


    COOKIEid  createtime            url    rn       last1  
    -----------------------------------------------------------------
    COOKIE1 2015-04-10 10:00:00     url1    1       url1
    COOKIE1 2015-04-10 10:00:02     url2    2       url2
    COOKIE1 2015-04-10 10:03:04     1url3   3       1url3
    COOKIE1 2015-04-10 10:10:00     url4    4       url4
    COOKIE1 2015-04-10 10:50:01     url5    5       url5
    COOKIE1 2015-04-10 10:50:05     url6    6       url6
    COOKIE1 2015-04-10 11:00:00     url7    7       url7
    COOKIE2 2015-04-10 10:00:00     url11   1       url11
    COOKIE2 2015-04-10 10:00:02     url22   2       url22
    COOKIE2 2015-04-10 10:03:04     1url33  3       1url33
    COOKIE2 2015-04-10 10:10:00     url44   4       url44
    COOKIE2 2015-04-10 10:50:01     url55   5       url55
    COOKIE2 2015-04-10 10:50:05     url66   6       url66
    COOKIE2 2015-04-10 11:00:00     url77   7       url77

如果不指定ORDER BY,则默认按照记录在文件中的偏移量进行排序,会出现错误的结果

    SELECT COOKIEid,
    createtime,
    url,
    FIRST_VALUE(url) OVER(PARTITION BY COOKIEid) AS first2  
    FROM lxw1234;

    COOKIEid  createtime            url     first2
    ----------------------------------------------
    COOKIE1 2015-04-10 10:00:02     url2    url2
    COOKIE1 2015-04-10 10:00:00     url1    url2
    COOKIE1 2015-04-10 10:03:04     1url3   url2
    COOKIE1 2015-04-10 10:50:05     url6    url2
    COOKIE1 2015-04-10 11:00:00     url7    url2
    COOKIE1 2015-04-10 10:10:00     url4    url2
    COOKIE1 2015-04-10 10:50:01     url5    url2
    COOKIE2 2015-04-10 10:00:02     url22   url22
    COOKIE2 2015-04-10 10:00:00     url11   url22
    COOKIE2 2015-04-10 10:03:04     1url33  url22
    COOKIE2 2015-04-10 10:50:05     url66   url22
    COOKIE2 2015-04-10 11:00:00     url77   url22
    COOKIE2 2015-04-10 10:10:00     url44   url22
    COOKIE2 2015-04-10 10:50:01     url55   url22

    SELECT COOKIEid,
    createtime,
    url,
    LAST_VALUE(url) OVER(PARTITION BY COOKIEid) AS last2  
    FROM lxw1234;

    COOKIEid  createtime            url     last2
    ----------------------------------------------
    COOKIE1 2015-04-10 10:00:02     url2    url5
    COOKIE1 2015-04-10 10:00:00     url1    url5
    COOKIE1 2015-04-10 10:03:04     1url3   url5
    COOKIE1 2015-04-10 10:50:05     url6    url5
    COOKIE1 2015-04-10 11:00:00     url7    url5
    COOKIE1 2015-04-10 10:10:00     url4    url5
    COOKIE1 2015-04-10 10:50:01     url5    url5
    COOKIE2 2015-04-10 10:00:02     url22   url55
    COOKIE2 2015-04-10 10:00:00     url11   url55
    COOKIE2 2015-04-10 10:03:04     1url33  url55
    COOKIE2 2015-04-10 10:50:05     url66   url55
    COOKIE2 2015-04-10 11:00:00     url77   url55
    COOKIE2 2015-04-10 10:10:00     url44   url55
    COOKIE2 2015-04-10 10:50:01     url55   url55

如果想要取分组内排序后最后一个值,则需要变通一下:

    SELECT COOKIEid,
    createtime,
    url,
    ROW_NUMBER() OVER(PARTITION BY COOKIEid ORDER BY createtime) AS rn,
    LAST_VALUE(url) OVER(PARTITION BY COOKIEid ORDER BY createtime) AS last1,
    FIRST_VALUE(url) OVER(PARTITION BY COOKIEid ORDER BY createtime DESC) AS last2
    FROM lxw1234
    ORDER BY COOKIEid,createtime;

    COOKIEid  createtime            url     rn     last1    last2
    -------------------------------------------------------------
    COOKIE1 2015-04-10 10:00:00     url1    1       url1    url7
    COOKIE1 2015-04-10 10:00:02     url2    2       url2    url7
    COOKIE1 2015-04-10 10:03:04     1url3   3       1url3   url7
    COOKIE1 2015-04-10 10:10:00     url4    4       url4    url7
    COOKIE1 2015-04-10 10:50:01     url5    5       url5    url7
    COOKIE1 2015-04-10 10:50:05     url6    6       url6    url7
    COOKIE1 2015-04-10 11:00:00     url7    7       url7    url7
    COOKIE2 2015-04-10 10:00:00     url11   1       url11   url77
    COOKIE2 2015-04-10 10:00:02     url22   2       url22   url77
    COOKIE2 2015-04-10 10:03:04     1url33  3       1url33  url77
    COOKIE2 2015-04-10 10:10:00     url44   4       url44   url77
    COOKIE2 2015-04-10 10:50:01     url55   5       url55   url77
    COOKIE2 2015-04-10 10:50:05     url66   6       url66   url77
    COOKIE2 2015-04-10 11:00:00     url77   7       url77   url77




推荐阅读
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 如何在Mac上构建高效的本地服务器环境
    在Mac上构建高效的本地服务器环境,首先需要了解基本步骤:1. 配置目录基础;2. 启动Apache服务;3. 添加自定义文档至本地服务器;4. 查看自定义效果。此外,还可以通过手机或其他电脑访问本机服务器,以确保跨设备的兼容性和调试效果。Mac系统自带的Apache服务为本地开发提供了便捷的工具,本文将详细介绍每个步骤的具体操作方法。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 利用Apache构建高效稳定的Web服务器环境
    本文详细介绍了如何利用Apache构建高效稳定的Web服务器环境。首先,概述了Apache服务器的基本概念及其安装步骤,并深入探讨了相关配置文件的设置方法。接着,通过具体的实验环境示例,展示了服务端(域名:zhangpp63.cn,IP地址:192.168.1.63)和客户端的配置过程,确保读者能够全面理解并实际应用这些技术。此外,还提供了一些优化建议,以提高服务器的性能和稳定性。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 在Linux环境下,本文详细探讨了Apache服务器中CGI技术的应用与实现。首先,通过使用yum包管理器安装了必要的软件,如PHP。安装完成后,对Apache服务器进行了配置,确保CGI功能正常运行。此外,还介绍了如何编写和调试CGI脚本,以及如何在实际环境中部署这些脚本以提供动态网页内容。实验结果表明,通过合理的配置和优化,Apache服务器能够高效地支持CGI应用程序,为用户提供丰富的交互体验。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • HBase客户端Table类中getRpcTimeout方法的应用与编程实例解析 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
author-avatar
Happy_Kelly尊荣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有