环境信息:
Hive版本号为apache-hive-0.14.0-bin
Hadoop版本号为hadoop-2.6.0
Tez版本号为tez-0.7.0


创建表:

),第三个參数为默认值(当往上第n行为NULL时候。取默认值,如不指定,则为NULL)

SELECT

polno,

eff_date,

userno,

ROW_NUMBER() OVER(PARTITION BY polno ORDER BY eff_date) AS rn,

LAG(eff_date,1,'1970-01-01 00:00:00') OVER(PARTITION BY polno ORDER BY eff_date) AS last_1_time,

LAG(eff_date,2) OVER(PARTITION BY polno ORDER BY eff_date) AS last_2_time

FROM windows_ss;

结果:

polno                        eff_date                              userno       rn    last_1_time                  last_2_time

P066666666666     2016-04-02 09:00:00      user02     1     1970-01-01 00:00:00      NULL

P066666666666     2016-04-02 09:00:02      user01     2     2016-04-02 09:00:00      NULL

P066666666666     2016-04-02 09:03:04      user11     3     2016-04-02 09:00:02      2016-04-02 09:00:00

P066666666666     2016-04-02 09:10:00      user09     4     2016-04-02 09:03:04      2016-04-02 09:00:02

P066666666666     2016-04-02 09:50:01      user32     5     2016-04-02 09:10:00      2016-04-02 09:03:04

P066666666666     2016-04-02 09:50:05      user03     6     2016-04-02 09:50:01      2016-04-02 09:10:00

P066666666666     2016-04-02 10:00:00      user51     7     2016-04-02 09:50:05      2016-04-02 09:50:01

P088888888888     2016-04-02 09:00:00      user55     1     1970-01-01 00:00:00      NULL

P088888888888     2016-04-02 09:00:02      user41     2     2016-04-02 09:00:00      NULL

P088888888888     2016-04-02 09:03:04      user23     3     2016-04-02 09:00:02      2016-04-02 09:00:00

P088888888888     2016-04-02 09:10:00      user22     4     2016-04-02 09:03:04      2016-04-02 09:00:02

P088888888888     2016-04-02 09:50:01      user31     5     2016-04-02 09:10:00      2016-04-02 09:03:04

P088888888888     2016-04-02 09:50:05      user80     6     2016-04-02 09:50:01      2016-04-02 09:10:00

P088888888888     2016-04-02 10:00:00      user08     7     2016-04-02 09:50:05      2016-04-02 09:50:01

分析:

last_1_time: 指定了往上第1行的值。default为'1970-01-01 00:00:00'

P066666666666第一行。往上1行为NULL,因此取默认值 1970-01-01 00:00:00

P066666666666第三行,往上1行值为第二行值。2016-04-02 09:00:02

P066666666666第六行,往上1行值为第五行值。2016-04-02 09:50:01

last_2_time: 指定了往上第2行的值,为指定默认值

P088888888888第一行,往上2行为NULL

P088888888888第二行,往上2行为NULL

P088888888888第四行。往上2行为第二行值。2016-04-02 09:00:02

P088888888888第七行,往上2行为第五行值,2016-04-02 09:50:01

2. LEAD

与LAG相反

LEAD(col,n,DEFAULT) 用于统计窗体内往下第n行值

第一个參数为列名。第二个參数为往下第n行(可选,默觉得1),第三个參数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

SELECT

polno,

eff_date,

userno,

ROW_NUMBER() OVER(PARTITION BY polno ORDER BY eff_date) AS rn,

LEAD(eff_date,1,'1970-01-01 00:00:00') OVER(PARTITION BY polno ORDER BY eff_date) AS next_1_time,

LEAD(eff_date,2) OVER(PARTITION BY polno ORDER BY eff_date) AS next_2_time

FROM windows_ss;

结果:

polno                                  eff_date                     userno   rn    next_1_time                 next_2_time

P066666666666     2016-04-02 09:00:00      user02     1     2016-04-02 09:00:02      2016-04-02 09:03:04

P066666666666     2016-04-02 09:00:02      user01     2     2016-04-02 09:03:04      2016-04-02 09:10:00

P066666666666     2016-04-02 09:03:04      user11     3     2016-04-02 09:10:00      2016-04-02 09:50:01

P066666666666     2016-04-02 09:10:00      user09     4     2016-04-02 09:50:01      2016-04-02 09:50:05

P066666666666     2016-04-02 09:50:01      user32     5     2016-04-02 09:50:05      2016-04-02 10:00:00

P066666666666     2016-04-02 09:50:05      user03     6     2016-04-02 10:00:00      NULL

P066666666666     2016-04-02 10:00:00      user51     7     1970-01-01 00:00:00      NULL

P088888888888     2016-04-02 09:00:00      user55     1     2016-04-02 09:00:02      2016-04-02 09:03:04

P088888888888     2016-04-02 09:00:02      user41     2     2016-04-02 09:03:04      2016-04-02 09:10:00

P088888888888     2016-04-02 09:03:04      user23     3     2016-04-02 09:10:00      2016-04-02 09:50:01

P088888888888     2016-04-02 09:10:00      user22     4     2016-04-02 09:50:01      2016-04-02 09:50:05

P088888888888     2016-04-02 09:50:01      user31     5     2016-04-02 09:50:05      2016-04-02 10:00:00

P088888888888     2016-04-02 09:50:05      user80     6     2016-04-02 10:00:00      NULL

P088888888888     2016-04-02 10:00:00      user08     7     1970-01-01 00:00:00      NULL

分析:

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

3. FIRST_VALUE

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

SELECT

polno,

eff_date,

userno,

ROW_NUMBER() OVER(PARTITION BY polno ORDER BY eff_date) AS rn,

FIRST_VALUE(userno) OVER(PARTITION BY polno ORDER BY eff_date) AS first1

FROM windows_ss;

polno                  eff_date                  userno     rn    first1

P066666666666     2016-04-02 09:00:00      user02     1     user02

P066666666666     2016-04-02 09:00:02      user01     2     user02

P066666666666     2016-04-02 09:03:04      user11     3     user02

P066666666666     2016-04-02 09:10:00      user09     4     user02

P066666666666     2016-04-02 09:50:01      user32     5     user02

P066666666666     2016-04-02 09:50:05      user03     6     user02

P066666666666     2016-04-02 10:00:00      user51     7     user02

P088888888888     2016-04-02 09:00:00      user55     1     user55

P088888888888     2016-04-02 09:00:02      user41     2     user55

P088888888888     2016-04-02 09:03:04      user23     3     user55

P088888888888     2016-04-02 09:10:00      user22     4     user55

P088888888888     2016-04-02 09:50:01      user31     5     user55

P088888888888     2016-04-02 09:50:05      user80     6     user55

P088888888888     2016-04-02 10:00:00      user08     7     user55

4. LAST_VALUE

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

SELECT

polno,

eff_date,

userno,

ROW_NUMBER() OVER(PARTITION BY polno ORDER BY eff_date) AS rn,

LAST_VALUE(userno) OVER(PARTITION BY polno ORDER BY eff_date) AS last1

FROM windows_ss;

结果:

polno                                  eff_date                   userno      rn    last1

P066666666666     2016-04-02 09:00:00      user02     1     user02

P066666666666     2016-04-02 09:00:02      user01     2     user01

P066666666666     2016-04-02 09:03:04      user11     3     user11

P066666666666     2016-04-02 09:10:00      user09     4     user09

P066666666666     2016-04-02 09:50:01      user32     5     user32

P066666666666     2016-04-02 09:50:05      user03     6     user03

P066666666666     2016-04-02 10:00:00      user51     7     user51

P088888888888     2016-04-02 09:00:00      user55     1     user55

P088888888888     2016-04-02 09:00:02      user41     2     user41

P088888888888     2016-04-02 09:03:04      user23     3     user23

P088888888888     2016-04-02 09:10:00      user22     4     user22

P088888888888     2016-04-02 09:50:01      user31     5     user31

P088888888888     2016-04-02 09:50:05      user80     6     user80

P088888888888     2016-04-02 10:00:00      user08     7     user08

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

FIRST_VALUE没有排序:

SELECT

    polno,

    eff_date,

    userno,

    FIRST_VALUE(userno) OVER(PARTITION BY polno) AS first2  

FROM windows_ss;

polno                             eff_date                          userno   first2

P066666666666     2016-04-02 09:00:02      user01     user01

P066666666666     2016-04-02 09:00:00      user02     user01

P066666666666     2016-04-02 09:03:04      user11     user01

P066666666666     2016-04-02 09:50:05      user03     user01

P066666666666     2016-04-02 10:00:00      user51     user01

P066666666666     2016-04-02 09:10:00      user09     user01

P066666666666     2016-04-02 09:50:01      user32     user01

P088888888888     2016-04-02 09:00:02      user41     user41

P088888888888     2016-04-02 09:00:00      user55     user41

P088888888888     2016-04-02 09:03:04      user23     user41

P088888888888     2016-04-02 09:50:05      user80     user41

P088888888888     2016-04-02 10:00:00      user08     user41

P088888888888     2016-04-02 09:10:00      user22     user41

P088888888888     2016-04-02 09:50:01      user31     user41

LAST_VALUE没有排序:

SELECT

polno,

eff_date,

userno,

LAST_VALUE(userno) OVER(PARTITION BY polno) AS last2

FROM windows_ss;

结果:

polno                           eff_date                              userno last2

P066666666666     2016-04-02 09:00:02      user01     user32

P066666666666     2016-04-02 09:00:00      user02     user32

P066666666666     2016-04-02 09:03:04      user11     user32

P066666666666     2016-04-02 09:50:05      user03     user32

P066666666666     2016-04-02 10:00:00      user51     user32

P066666666666     2016-04-02 09:10:00      user09     user32

P066666666666     2016-04-02 09:50:01      user32     user32

P088888888888     2016-04-02 09:00:02      user41     user31

P088888888888     2016-04-02 09:00:00      user55     user31

P088888888888     2016-04-02 09:03:04      user23     user31

P088888888888     2016-04-02 09:50:05      user80     user31

P088888888888     2016-04-02 10:00:00      user08     user31

P088888888888     2016-04-02 09:10:00      user22     user31

P088888888888     2016-04-02 09:50:01      user31     user31

 

假设想要取分组内排序后最后一个值,则须要变通一下:

SELECT

polno,

eff_date,

userno,

ROW_NUMBER() OVER(PARTITION BY polno ORDER BY eff_date) AS rn,

LAST_VALUE(userno) OVER(PARTITION BY polno ORDER BY eff_date) AS last1,

FIRST_VALUE(userno) OVER(PARTITION BY polno ORDER BY eff_date DESC) AS last2

FROM windows_ss ORDER BY polno,eff_date;

polno                                 eff_date                     userno     rn    last1       last2

P066666666666     2016-04-02 09:00:00      user02     1     user02     user51

P066666666666     2016-04-02 09:00:02      user01     2     user01     user51

P066666666666     2016-04-02 09:03:04      user11     3     user11     user51

P066666666666     2016-04-02 09:10:00      user09     4     user09     user51

P066666666666     2016-04-02 09:50:01      user32     5     user32     user51

P066666666666     2016-04-02 09:50:05      user03     6     user03     user51

P066666666666     2016-04-02 10:00:00      user51     7     user51     user51

P088888888888     2016-04-02 09:00:00      user55     1     user55     user08

P088888888888     2016-04-02 09:00:02      user41     2     user41     user08

P088888888888     2016-04-02 09:03:04      user23     3     user23     user08

P088888888888     2016-04-02 09:10:00      user22     4     user22     user08

P088888888888     2016-04-02 09:50:01      user31     5     user31     user08

P088888888888     2016-04-02 09:50:05      user80     6     user80     user08

P088888888888     2016-04-02 10:00:00      user08     7     user08     user08

注意:

在使用分析函数的过程中,要特别注意ORDERBY子句,用的不恰当。统计出的结果就不是你所期望的

Hive分析窗体函数之LAG,LEAD,FIRST_VALUE和LAST_VALUE的更多相关文章

  1. Hive函数:LAG,LEAD,FIRST_VALUE,LAST_VALUE

    参考自大数据田地:http://lxw1234.com/archives/2015/04/190.htm 测试数据准备: create external table test_data ( cooki ...

  2. Hive分析窗体函数之SUM,AVG,MIN和MAX

    行 AVG(pnum) OVER(PARTITION BYpolno ORDER BY createtime ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOW ...

  3. Hive分析窗体函数之NTILE,ROW_NUMBER,RANK和DENSE_RANK

    開始,依照顺序,生成分组内记录的序列–比方,依照pnum降序排列.生成分组内每天的pnum名次ROW_NUMBER() 的应用场景许多.再比方,获取分组内排序第一的记录等等. SELECT polno ...

  4. SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing

    SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...

  5. pandas实现hive的lag和lead函数 以及 first_value和last_value函数

    lag和lead VS shift 该函数的格式如下: 第一个参数为列名, 第二个参数为往上第n行(可选,默认为1), 第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL ...

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

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

  7. 开窗函数 First_Value 和 Last_Value

    在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...

  8. Hive自己定义函数的使用——useragent解析

    想要从日志数据中分析一下操作系统.浏览器.版本号使用情况.可是hive中的函数不能直接解析useragent,于是能够写一个UDF来解析.useragent用于表示用户的当前操作系统,浏览器版本号信息 ...

  9. HIVE扩展GIS函数

        按项目日益增长的gis数据量要求,需要在大数据集群中部署HIVE的扩展函数.     Apache Hive是一个建立在Hadoop架构之上的数据仓库.它能够提供数据的精炼,查询和分析.([引 ...

随机推荐

  1. [BZOJ4883][Lydsy1705月赛]棋盘上的守卫(Kruskal)

    对每行每列分别建一个点,问题转为选n+m条边,并给每条边选一个点覆盖,使每个点都被覆盖.也就是最小生成环套树森林. 用和Kruskal一样的方法,将边从小到大排序,若一条边被选入后连通块仍然是一个环套 ...

  2. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  3. 【贪心】Google Code Jam Round 1A 2018 Waffle Choppers

    题意:给你一个矩阵,有些点是黑的,让你横切h刀,纵切v刀,问你是否能让切出的所有子矩阵的黑点数量相等. 设黑点总数为sum,sum必须能整除(h+1),进而sum/(h+1)必须能整除(v+1). 先 ...

  4. 关于多重嵌套的JSON数据解析

    最近项目中需要封装一套复杂的数据模型返回给前端,大致就是一个用户会有多笔订单,每个订单下可能会有多笔保单, 大致的数据模型如下: 为了方面描述,先看一下一个用户下有一条订单,一条订单下有一个保险订单的 ...

  5. mysql关联查询和联合查询

    一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...

  6. List常用子类的特点

    ArrayList:    底层数据结构是数组,查询快,增删慢   线程不安全, 效率较高 Vector   底层数据结构是数组,查询快,增删慢   线程安全, 效率较低 LinkedList   底 ...

  7. vue-router query和params传参(接收参数),$router、$route的区别

    链接:https://segmentfault.com/a/1190000012735168 1.query方式传参和接收参数 传参: this.$router.push({ path:'/xxx' ...

  8. SSH深度历险(四) Maven初步学�

    这几天接触这个词,非常多遍了,仅仅是浅显的体会到它在GXPT中的优点,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),能够通过一小段描写叙述信 ...

  9. [MySql]windows下设置mysql默认编码

    摘要 在安装好mysql的时候,如果新建数据库或者表默认的编码为latin1,如果这时候插入中文时,出出现类似下面的乱码的问题. SQLException: Incorrect string valu ...

  10. 【微信小程序】处理时间格式,时间戳转化展示时间格式问题,调用外部js的默认方法function的问题

    默认的 小程序中new Date()显示的时间是这样的: 格式化时间的显示怎么做: 小程序的根目录下util目录下默认有一个util.js文件 其中util.js文件内容是: //数据转化 funct ...