开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段): 网站流量日志分析--统计分析--多维统计分析--时间维度--每小时指标统计】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12220
网站流量日志分析--统计分析--多维统计分析--时间维度--每小时指标统计
1、打开资料,项目资料,数据分析,基础指标多维统计。
2、多维度统计分析:注意 gruop by 语句的语法
多维度统计 PV 总量
第一种方式:直接在 dw. weblog_ detail 单表上进行查询
计算该处理批次(一天)中的各小吋 pvs
3、梳理
时间维度统计
计算该处理批次(一天)中的各小吋 pvs,页面被点击加载的次数,跟点击流模型中的会话第一步第二步停留时间也没有太多关系,优先考虑 detail 宽表。
(1)数据表:dw_ weblog_ detail
(2)分组字段:时间(day hour)一天当中包含多个小时,day 字段比较特殊,day 是表分区字段,可以通过 where 过滤查找,统计完真正有意义起决定作用的是 hour 统计每小时。
就是维度,一天不是处理昨天,也不是处理后天,是处理当天,因此分组段是时间维度的分组段。打开宽表查看最后是以天分区,20181101。
(3)度量值:count(*)
直接统计*就相当于把里面不管是静态资源的请求还是动态资源都当做页面被加载的点击次数,想要更加贴近于实战应该加各过滤条件,valid 等于 true,把静态资源过滤掉。由于项目数据本身比较小,所以做了妥协,但是要清楚背后发生了什么。
跟宽表,起别名,该数据批次是1000,天是分区字段,通过t.分区字段可以找到这一天,因此针对天这个指标不需要分组,直接通过 where 即可,如果数据是干净纯净,一定得到的是11月1日的数据,得到这一天的数据还要进行分组得到各个小时,一天有24个小时,分为24个部分,每个部分中再进行 count 统计,写的时候要根据小时分组确定表中有没有 hour 字段,打开宽表数据查看,宽表中有用户标识,时间,日期,month,day,hour,可以感受到进行入库时生成宽表就是为了分析的方便,现在把hour踢出来变成一个新的字段,直接进行 hour 分组即可,不管是六点四十九分还是六点五十分的都属于六点就该来到同一分组中。
按照一天中小时分组就会分成24小时,每个小时进行 count 统计。
select
count(*) as pvs
from dw_weblog_ detail t where t.datestr ="20181101" group by t.hour ;
在 hive 中执行验证,得到每个小时的 pvs,但是看不出来是哪个小时的pvs,所以在查询上显示出属于哪个小时,需要把 hour 字段出现在 select 表中,注意group by 分组语法,因为 hour 是分组字段所以可以出现在表达式中,再执行。在七八九小时中,pvs 点击比较多,大概在早上的七八点钟,网站的访问量比较多,可能是新闻门户类的网站,早高峰大家都在浏览。
但是如果写完就结束,意味着数据并没有保存下来,输入 show
tables
进行查看,计算的指标并没有保存在数仓中,因此在实际的开发过程中指标和模型数据为了方便临时表记录下来,需要时就不用再执行 sql,直接用即可。
4、创建中间表也叫临时表,有个小技巧就是创建临时表或者别的表不要用汉语拼音进行命名,比如 time1,time2等,在企业中一般建议用简单的英文表示表的含义,比如创建一个表,一天当中每个小时的 pvs,这个表是一个分区表,根据时间进行分区
drop table dw_ pvs_ everyhour_ oneday;
create table dw_ pvs_ everyhour_ oneday (month string,day string,hour string,pvs bigint) partitioned by (datestr string) ;
insert into table dw_ pvs_everyhour_oneday partition (datestr= '20181101')
select a.month as month,a.day as day,a.hour as hour, count(*) as pvs from dw_ weblog_ detail a
在宽表进行操作,分区过滤
Where a.datestr='20181101' group by a . month,a.day,a . hour;
注意分组字段对结果的影响
计算每天的 pvs
drop table dw_ pv3_ everyday;
create table dw_ pvs_ everyday (pvs bigint , month string,day string) ;
insert into table dw_ pv3_ everyday
select count(*) as pvs,a.month as month,a.day as day from dw_ weblog_ detail a group by a . month,a.day;
复制create table dw_ pvs_ everyhour_ oneday (month string,day string,hour string,pvs bigint) partitioned by (datestr string) ;
执行,返回的字段有两个,一个是 hour,一个是 pvs,而这个表中是 month,需要保证查询反馈的结果,字段类型顺序个数跟它对应上。
要想返回 month day hour 比较简单,因为数据表中正好有 month day,如果分组字段不错。
select
t.day,t.hour ,count(*) as pvs
from dw. _weblog detail t where t.datestr ="20181101" group by t
.
hour;
执行后报错,在 compiling 编译期间的错误,Invalid column refere
nce
’
day‘
非法的字段引用day。
--直接报错Invalid column refere
nce
’
day‘
--想一想:sql 语句 groupby 有什么样的语法限制问题。
出现在 groupby 语句表达式中的字段:要么是分组的字段,要么是被聚合函数包围应用的字段。这是所谓的语法限制。
需要进行相关的调整,不能这样引用。day 既不是分组的字段也不是聚合函数包围的字段。如果直接写 t.month t.day 肯定会报错,需要针对两个字段进行调整,比如放在分组字段 groupby 后面,本意是根据 hour 进行分组,结合具体环境进行分析,在当下环境中加入分组字段不会改变结果,因为 where 指定过滤是20181101的数据,如果数据干净整洁,纯洁没有被污染的数据,保证得到的是20181101这一天的数据,根据月份分是11月一个整体,根据day分还是1号整体,因此字段的出现,保证了 month 和 day 对结果没有影响,最终起决定作用的是 hour,它俩的出现保证字段可以出现在前面,不会报错,执行。
在数据中,人为的把一号变成了二号,对于后面的指标计算比较方便。
5、把查询结果插入到创建的 pvs everyhour 中,分组根据 month day hour 进行分组,三个中真正起决定作用的是 hour,month,day 无效,但是可以出现在表达式中,统计 pvs,四个字段拆入到创建的表中完成数据保证,复制到 hive 终端,执行看结果,打开临时表看数据有没有保存进去,select * from dw pvs_ everyhour_ oneday;
显示每一天的 pvs 数,十一月中每个小时产生的 pvs,可以进行最终页面的报表展示。第一个需求是统计每个小时的 pvs,重点是 sql 语句语法的掌握,灵活运用到业务中。