Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)|学习笔记

简介: 快速学习 Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段) Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/696/detail/12235


Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)

内容介绍

一、准备数据

二、LAG

、LEAD

、FIRST_ VALUE

、LAST_ VALUE

特别注意 order by


一、准备数据

1、了解分组窗口函数中几个常见的取值函数这些函数从名字上就可以简单了解它FIRST_VALUE 第一个值,LAST_VALUE 最后一个值lag 向上取整lead 向下取整注意这几个函数不支持 WINDOW 子句就是 row between 控制行数

2、cookie1,2018-04-10 10:00:02,ur12

Cookie1,2018-04-10 10:00:00,ur11

cookie1,2018-04-10 10:03 :04,lur13

cookie1,2018-04-10 10:50:05,ur16

Cookie1,2018-04-10 11:00:00,ur17

cookie1,2018-04-10 10:10:00,ur14

cookie1,2018-04-10 10:50:01,ur15

cookie2,2018-04-10 10:00:02,ur122

cookie2,2018-04-10 10:00:00,ur111

cookie2,2018-04-10 10:03:04,lur133

cookie2,2018-04-10 10:50:05 ,ur166

cookie2,2018-04-10 11:00:00,ur177

cookie2,2018-04-10 10:10:00,ur144

cookie2,2018-04-10 10:50:01,ur155

CREATE TABLE itcast_t4 (

cookieid string,

createtime string,--页面访问时间

ur1 STRING --被访问页面

) ROW FORMAT DELIMITED

FIELDS TERMINATED BY ', '

stored as textfile;

Cookie id 用户,Cookie 创建的时间有完整的数据url 访问哪个页面创建表把结构化数据映射出来创建完表之后当中的字段以及类型要跟数据保持对应指定分隔符为逗号

3、复制准备好文件打开本地vim 编辑把结构化数据复制过去粘贴保存

cookie1,2018-04-10 10:00:02,ur12

Cookie1,2018-04-10 10:00:00,ur11

cookie1,2018-04-10 10:03 :04,lur13

cookie1,2018-04-10 10:50:05,ur16

Cookie1,2018-04-10 11:00:00,ur17

cookie1,2018-04-10 10:10:00,ur14

cookie1,2018-04-10 10:50:01,ur15

cookie2,2018-04-10 10:00:02,ur122

cookie2,2018-04-10 10:00:00,ur111

cookie2,2018-04-10 10:03:04,lur133

cookie2,2018-04-10 10:50:05 ,ur166

cookie2,2018-04-10 11:00:00,ur177

cookie2,2018-04-10 10:10:00,ur144

cookie2,2018-04-10 10:50:01,ur155

4、创建表以及把数据给加载到表中复制建表语句 create table打开 hive 终端使用 load 命令把数据从 hive 服务器的本地加载到数仓中复制执行

加载数据:

load data local inpath ' /root/hivedata/itcast_t4.dat' into table itcast_t4;

5、加载成功后验证数据是否映射成功select*,操作相当于提前保证数据不会有问题映射解析非常完美没有出现 null 情况

 

二、LAG

1、LAG(cd,n,DEFAULT)中可以指定三个字段,用于统计窗口内往上第 n 行

2、第一个参数为统计哪个列,取哪个列的值,,第二个参数是一个数字表示往上第n行(可选默认为1) , 第三个参数内默认值(当往上第 n 行NULL 吋候,取默认值,如不指定,则为 NULL )如果现在就是第一行再往上取一行第一行之前没有数据就会出现为空如果为空的情况下如果有默认值就用默认值填充如果没有默认值不指定就设置为 null

SELECT cookieid,

createtime ,

ur1,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,在每个分组内做ROW_NUMBER()打标号方便看数据排序的步骤号根据cookie进行分组根据创建时间进行排序

根据cookieid进行分组整个数据会分成两组一个叫做cookie1,一个叫做cookie2,每个分组内 rn 做了row number打上序号标号的操作,1234567,一二分组内

LAG(createtime ,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY向上取一行提取创建时间取一行的值如果上面一行没有字段默认以它进行填充当拿第一行值时向上取一行它本身是第一行向上没有数据但是有填充所以它的值是1970-01-01。整个数据都往下了一行

createtime) AS last_ 1_time,

LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS last_ 2_time向上取两行但是没有默认值填充当向上取两行没有值时默认返回 null当取第一行往上取两行没有值没 null当取第二行时依然没有值当取第三行记录时它往上两行正好是第一行的记录10.00相当于往下了两行

FROM itcast_ t4;

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

1ast_ 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-0100: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 itcast _t4;

复制打开 hive 终端进行执行当取第一个 leag1 时向下取一行值拿第一行内容时实际上取的是第二行值十点零二相当于把这行内容填在第一行第二行填充给第一行第三行填充给第二行当到第七行值时它需要拿到下面这一行这时分组已经结束只能采用默认值进行填充所以最后一行值是1970-01-0100:00:00,正好跟LAG是相反的操作向下取两值也是一样拿到第一行值时应该拿到的是第三行第三行提到第一行第四行提到第二行如果没有返回为 null这就是向下取法


四、FIRST_ VALUE

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

SELECT cookieid,

createtime,

ur1,

ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

FIRST_VALUE(ur1) OVER(PARTITION BY cookieid ORDER BY createtime) AS first1

FROM itcast_ t4;

根据 cookieid 进行分组每个分组内根据创建的时间进行排序而且是正序提取 url 的第一值但是要注意截取当前值的第一个字截取到第二行 url1,当取 FIRST_VALUE 时永远都是截取当前值的第一个值就是整个分组的第一个值每个都是截取当前值的第一个值url11,三个值在一起还是取 url11。


五、LAST_VALUE

取分组内排序后,截止到当前行,最后一个值,就是取自己本身的值SELECT cookieid,

createtime,

url,

ROW_ NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,

LAST_VALUE (ur1) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1

FROM itcast_t4;

第一行截止到最后一个值 url1自己本身截止到第二行当前自己本身 url2,因此LAST_VALUE就是取自己本身把数据进行排序取第一个值还是最后一个值跟分组内的排序相关正序或者倒序直接影响最后的取值结果

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

SELECT cookieid,

createtime,

url,

ROW NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn.

LAST_ VALUE (ur1) OVER(PARTITION BY cookieid ORDER BY createtime) AS lastl,

FIRST_VALUE(ur1) OVER(PARTITION BY cookieid ORDER BY createtime DESC) AS last2

FROM itcast_ _t4

ORDER BY cookieid,createtime;

根据时间 createtime 进行倒序排序再取第一个值相当于取每个分组内的最后一个值在排序时把时间倒序排序相当于主力数据库的排序再取 FIRST_VALUE 分组内最后一个值复制执行发现每个值都是分组内最后一个值ur17,相当于把时间做了倒序的排序取第一个值倒序的排序最大排在前面取值都是ur17。

 

六、特别注意 order by

如果不指定 ORDER BY ,则进行排序混乱,会出现错误的结果

SELECT cookieid,

createtime ,

url,

FIRST_ VALUE(ur1) OVER(PARTITION BY cookieid) AS first2

FROM itcast_ t4;

注意取值函数的使用在分组后排序对最终结果影响非常大

相关文章
|
6月前
|
SQL HIVE
hive窗口函数应用实例
hive窗口函数应用实例
159 3
|
6月前
|
SQL HIVE
Hive 【Hive(七)窗口函数练习】
Hive 【Hive(七)窗口函数练习】
|
6月前
|
SQL 分布式计算 Serverless
Hive【Hive(六)窗口函数】
Hive【Hive(六)窗口函数】
|
SQL 大数据 开发工具
大数据Hive窗口函数应用实例 2
大数据Hive窗口函数应用实例
152 0
|
SQL 大数据 开发工具
大数据Hive窗口函数应用实例 1
大数据Hive窗口函数应用实例
89 0
|
2月前
|
SQL JavaScript 前端开发
Hive学习-lateral view 、explode、reflect和窗口函数
Hive学习-lateral view 、explode、reflect和窗口函数
38 4
|
6月前
|
SQL HIVE
【Hive SQL 每日一题】分组排名取值
创建了一个名为`sales_data`的测试表,包含商品ID、销售额和销售日期。展示了部分示例数据。接着,提供了三个SQL查询:1) 查找每个商品销售额最高的记录;2) 获取每个商品最近和最远的销售记录;3) 求每个商品距今第二近的销售记录。每个查询都利用了窗口函数来处理数据,并给出了相应的查询结果图。
86 1
|
6月前
|
SQL HIVE 索引
Hive窗口函数案例总结
Hive窗口函数案例总结
|
6月前
|
SQL
bigdata-23-Hive窗口函数
bigdata-23-Hive窗口函数
48 0
|
6月前
|
SQL JSON 算法
hive学习笔记
hive学习笔记