开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段): Hive 高阶--分组窗口函数--聚合函数集成分组函数(SUM)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12233
Hive 高阶--分组窗口函数--聚合函数集成分组函数(SUM)
1、聚合函数跟分组函数的配合使用,聚合函数指的是输入多行输出一行,针对数据做聚集,比如常见的 sum 求和,求平均值,最大最小等,跟分组函数 over 语句配合看具体例子,在讲义上做数据的准备,数据中有三个字段,分别是 cookie id,创建的时间以及产生的 pv 值。把结构化的数据映射在 hive 中构成表。
2、复制建表语句,打开 hive 的终端。
建表语句:
create table itcast_t1(
cookieid string,
createtime string , --day
pv int
) row format delimited
fields terminated by ' , ' ;
在服务器上进行创建,创建好表之后使用命令把数据加载到里面,如果没有,需要把结构文件进行复制,有了数据后直接使用 load 加载。
l
oad data
l
oca1 inpath ' /root/hivedata/itcast_ t1.dat' into table itcast. _t1;
加载完后,为了分析方便,用查询语句验证数据是否映射成功,数据量比较小可以不加 limit。
3、如果直接对 pv 字段进行聚合,7条经过它返回的结果有一条,一条的结果就是把所有的内容加起来,返回26。
4、根据 cookie 来进行分组,将会分为一组,每个组内 order by createtime,再根据创建的时间的正序,默认的排序,从4月10号到4月16号,在分组内进行 sum(pv),结果 pv1,从语法上分组函数把些数据加起来,没有什么区别,但是执行结果反馈的是 pv1。执行语句。
select cookieid, createtime,pv,
还是原本的数据
sum(pv) over (partition by cookieid order by createtime) as pv1
from itcast_ t1;
重点看 pv1的内容,执行发现它并不是直接把pv1直接加出来,而是没有具体,每一行数据都做了 sum 求和,第一行的 sum pv1等于1,第二行是六,当聚合函数跟分组函数配合使用时,聚合就不再是整个分组聚合,而是截止到操作的当前号,现在没有加其他条件约束,sum 求和从第一行到当前行,取第一条记录时,它就是第一条加自己本身,就是一,第二行就是累加一加五变成六,第三条,1加5加7变成13,每一条记录的 sum 值都是当前行,往前所有数的累加,这是第一种情况。
5、根据 cookie 分组,根据 createtime 进行排序,进行分组并进行排序,从第一行一直到当前行,没有显示跟 pv1一样的结果,pv2 计算的数跟 pv1一样,默认没有写,在 hive 中 rows between 语句叫 window 子句,可以控制行数从哪里到哪里,如果不写 window 子句,默认是从第一行到当前行,写不写 unbounded
preceding and current row
都是默认第一行。
select cookieid , createtime ,pv,
sum(pv) over (partition by cookieid order by createtime rows between unbounded
preceding and current row) as pv2
from itcast_ t1;
6、没有根据创建时间,分完组之后没有排序,根据排序是10,11,12,13,14,15,16,意味着当没有排序时,数据如果产生顺序或者顺序不一样,对结果产生改变,因此第三个没有排序时,它并不是再次从当前的第一行累加到当前行,当没有排序之后,它是分组内所有的 P V 值累加,相当于普通的聚合函数,每个值都是26,不管到哪一行不再是从第一行累加到当前一行。
select cookieid ,createtime ,pv,
sum(pv) over (partition by cookieid) as pv3
from itcast_ t1;
--如果每天 order by 排序语句,默认把分组内的所有数据进 sum 操作。
7、根据 cookieid 进行分组,根据创建时间进行排序,加了子句,到当前行进行统计,只计算当前行往前的3行,执行,当前行记录是往前3行,前面4行数据跟之前一样,重点是倒数第二行,往前三行是7324加起来等于16,前面的51并没有计算出来,所以当前行往前3行一共计算4行。
select cookieid,createtime ,pv,
sum(pv) over (partition by cookieid order by createtime rows between 3 preceding and
current row) as pv4
from itcast_ t1;
8、关键是理解 rows between 含义,也叫做 window 子句
preceding :往前
following : 往后
current row : 当前行
unbounded : 起点
unbounded preceding:表示从前面的起点
unbounded following :表示到后面的終点
select cookieid, createtime,pv,
sum(pv) over (partition by cookieid order by createtime rows between 3 preceding and
1 fo
l
lowing) as pv5
from itcast_ .t1;
计算当前行数,需要往前推三行,往后加一行,找到2,往前三行573,后一行4,得到21,有了 rows between
window
子句,可以精准的控制从哪一行开始从哪一行结束,不写就是默认当前行到第一行。
9、select cookieid,createtime,pv,
sum(pv) over (partition by cookieid order by createtime rows between current row and unbounded following) as pv6
from itcast. _t1;
从当前行往最后一行。
10、通过的 order by 和 partition 控制组内的排序分组,结合 window 子句进行聚合,聚合函数跟默认的普通的聚合函数的行为就发生了改变。怎么聚合跟排序结果默认有很大的关系,把每个排序中加 dsc 倒序排序的结果就是另一种情况,聚合函数跟分组函数的配合使用中重要的是理解 window 子句的概念,再次强调 window 子句指的是 rows between 语句,它可以控制进行操作时起始和结束的位置,AVG,MIN,MAX 和 SUM 用法一祥,求平均值是从第一行到当前行的平均值还是往前三行,往后一行的平均值,求最大值是所有行的最大值还是当前行往前一行的最大值,跟 sum 类似,重点理解 window 子句和聚合函数配合分组函数该怎么使用。
select cookieid,createtime,pv,
avg(pv) over(partition by cookieid order by createtime rows between unbounded
preceding and current row) as pv2
from itcast_t1;
select cookieid,createtime,pv,
max(pv) over (partition by cookieid order by createtime rows between unbounded
preceding and current row) as pv2
from itcast _t1;
select cookieid,createtime,pv,
min(pv) over(partition by cookieid order by createtime rows between unbounded
preceding and current row) as pv2
from itcast_t1;