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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive 分析函数lead、lag实例应用相关的知识,希望对你有一定的参考价值。

参考技术A Lag和Lead分析函数可以在同一次查询中取出同一字段的后N行的数据(Lag)和前N行的数据(Lead)作为独立的列。

这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率,其中over()表示当前查询的结果集对象,括号里面的语句则表示对这个结果集进行处理。

与LAG相反,LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值

参数1为列名,参数2为往下第n行(可选,默认为1),参数3为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

用户Peter在浏览网页,在某个时刻,Peter点进了某个页面,过一段时间后,Peter又进入了另外一个页面,如此反复,那怎么去统计Peter在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?

使用 load 命令将如下测试数据导入:

数据说明:Peter 2015-10-12 01:10:00 url1 ,表示Peter在 2015-10-12 01:10:00 进入了网页 url2 ,即记录的是进入网页的时间。

要计算 Peter 在页面 url1 停留的时间,需要用进入页面 url2 的时间,减去进入 url1 的时间,即 2015-10-12 01:15:10 这个时间既是离开页面 url1 的时间,也是开始进入页面 url2 的时间。

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

stime就是进入页面时间,etime就是离开页面时间,结果是这样的:

用etime减去stime,然后按照用户分组累加就是,每个用户访问的总时间了。

这里展示出了stime(开始时间),etime(离开时间),period(停留时长),url(页面地址),结果:

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)可以用来做一些时间的维护,如上一次登录时间。

用户Peter在浏览网页,在某个时刻,Peter点进了某个页面,过一段时间后,Peter又进入了另外一个页面,如此反复,那怎么去统计Peter在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?

使用 load 命令将如下测试数据导入:

数据说明:Peter 2015-10-12 01:10:00 url1 ,表示Peter在 2015-10-12 01:10:00 进入了网页 url2 ,即记录的是进入网页的时间。

这里 etime 是结束时间, stime 是开始时间,结果:

计算总时间,只需要用结束时间 - 开始时间,然后分组累加即可。

结果

因为有两个我将默认值置为了 1970-01-01 ,所以算出来比较大,实际工作中需要按照实际情况处理。

ORACLE 偏移分析函数 lag()与lead() 用法

一、简介

  lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。

over()表示 lag()与lead()操作的数据都在over()的范围内,他里面可以使用partition by 语句(用于分组) order by 语句(用于排序)。partition by a order by b表示以a字段进行分组,再 以b字段进行排序,对数据进行查询。

  例如:lead(field, num, defaultvalue) field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值。
 

二、示例

表初始化数据为:

  a、获取当前记录的id,以及下一条记录的id  

select t.id id ,

lead(t.id, 1, null) over (order by t.id) next_record_id, t.cphm

from tb_test t

order by t.id asc

  b、获取当前记录的id,以及上一条记录的id

select t.id id ,

lag(t.id, 1, null) over (order by t.id) next_record_id, t.cphm

from tb_test t

order by t.id asc

  c、获取号牌号码相同的,当前记录的id与,下一条记录的id(使用partition by)

select t.id id,

lead(t.id, 1, null) over(partition by cphm order by t.id) next_same_cphm_id, t.cphm

from tb_test t

order by t.id asc

以上是关于Hive 分析函数lead、lag实例应用的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 偏移分析函数 lag()与lead() 用法

ORACLE 偏移分析函数 lag()与lead() 用法

Hive分析窗口函数

oracle lag与lead分析函数简介

Oracle分析函数之Lag和Lead()使用

Hive开窗函数