开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段): 网站流量日志分析--统计分析--多维统计分析--时间维度--维表关联查询】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12222
网站流量日志分析--统计分析--多维统计分析--时间维度--维表关联查询
1、时间维度统计分析,通过单表的操作计算出每个小时每一天或者每个月的相关指标,另一种方式与时间维表关联查询,在数仓模型建立时基于事实表可以关联各种各样不同的维度表,在创建本项目的表中,指定时间维度表,统计时间维度的相关指标,将事实表和维度表进行关联查询,关联的本质就是两个表进行join,join的同时需要指定join的条件,需要时间维度进行查询,join跟时间相关。相关的指标如何通过关联的方式得到结果,验证跟单表操作的结果是否一样。
2、为了方便,打开参考脚本中的思路脚本。时间维度还是计算每一天产生的 pvs,但是要求不是单表操作,而是和时间维表进行关联操作。
3、事实表(宽表)和维度表进行关联查询
关联查询的重点是确定 join 字段,跟时间相关的。
计算每天的产生的 pvs。
宽表中的数据有 month,day,hour提出来的字段,时间维度表也拆出来看,输入select*from t_dim_time;
因为表的数据不大,直接显示,在时间维表中也有month,day,hour不同的值,要进行关联查询会涉及到两个表的字段相等,要统计每一天的,小时不管是否相等,知道天要相等,进行指标时要指定 day 等于 day,month 等于 month,无可厚非因为是同一个月,关联时必须指定交易条件,比如把 a.month,把原来的事实表称为 a,实验表称为 b,month 等于 month,day 等于 day,相等的数据关联到一起,分组到一块进行统计,就是每一天具体的数据,1号关联1号,2号关联2号,就可以统计出来,用 join 关联实现整体的思路。
4、sql 的具体实现,sql 脚本资料中有一个 sql,里面创建了一个中间的临时表保存最终的数据叫 everyday pvs。
--维度: 日
drop table dw_ pvs_ everyday ;
create table dw_ pvs_ everyday (pvs bigint , month string,day string) ;
insert into table dw_ pvs_ everyday
select count(*) as pvs,a.month as month,a.day as day from (select distinct month, day from t_ dim time) a
join dw_ weblog_ detail b
on a.month=b.month and a .day=b.day
group by a . month,a.day;
当分析 sql 语句时,重点要确定 from 关键字后面的表以及涉及到的关联如何存在,一个表叫做表 a,另一个表叫做 表 b ,同月同一天经过分组分到同一月同一天进行统计,本质不就是用 t_dim_time 和 detail 进行关联,为什么还要做去重的操作?
5、第一种方式,不进行去重看返回是什么结果,不进行操作,打开 hive 终端,去掉 distinct 关键字,直接查询select month, day from t dim_ time ;
因为一天当中存在各个不同的小时,使得同一天可能有多个,不去重直接进行关联会有什么效果?
6、左边是事实表的数据,1101,1102,1101,起名为a,重点是时间维度表,如果不加 distinct 去重,join 条件等于 a.month=b.month,一个可以关联多个,一天有24个小时,如果不加过滤,左边的数据会跟右表关联24次,而且24次都符合关联的条件,24个结果,分组时统计就是24pv,相当于人为的把数据重复了,造成结果的原因很简单,一天有24小时,在时间维度表中 month 和 day 都等于1101,但是内部还存在零点一点两点,不管关联几次,只要关联一下,就有1101的数据,因此在select中针对结果做去重,去重后执行,再进行 join 就避免了问题,当拿1101只会跟1101进行关联,相同的数据再加上 group by 分组,只要关联上同一 month,同一天,来到同一分组中做 count 统计得到结果,这就是为什么要进行 distinct 去重的原因。
7、在数据中人为的改变了2号的数据,看结果是否一样,首先执行结果,再把结果插入到表中,复制,打开 hive 终端,可以看到访问结果,1101是10777,1102是2993,这个指标是否正确,查看第一种方式单表操作时每天结果是否正确,可以发现结果相同。
8、创建一个表叫 pvs everyday 每一天的 pv 统计,创建完之后,把查询结果通过insert语句把结果插入到表中,insert 加 sql 语句,复制执行,把结果保存起来,便于相关的操作,把表验证一下看计算是否正确,select
f
rom dw_ pvs_ everyday;
得到每一天的 pv 数据值,后面的页面展示也会方便。
9、为了更好的理解关联查询,进行拓展。
拓展:使用与维度表关联的方式计算每个小时的 pvs。
在进行关联时同一天某一 month 不行,还需要保证是同一小时才能达到这个结果。
select count(*) as pvs,a.month as month,a.day as day from (select distinct month, day from t_ dim time) a
join dw_ weblog_ detail b
宽表
on a.month=b.month and a .day=b.day and a. ho
ur
=b .hour
加条件,当写下关联字段时a表和b表有没有hour的字段是否满足join的条件
group by a . month,a.day;
宽表中有 hour 字段。
a 表就是查询语句返回的结果,返回语句中并没有 hour 字段,a 表中没有并不代表时间维度表中没有 hour 字段,在提取 month 和 day 的同时把 hour 提出来,再查询就有 hour,符合 a .month= b .month,
select count(*) as pvs ,a. month as month,a.day as day from (select distinct month, day, hour from t_ dim_ time) a
join dw_ web
l
og_ detai
l
b
on a. month=b . month and a. day=b.
d
ay and a. hour=b . hour
group by a.month,a. day;
只要是同一个月同一天同一个小时应该来到同一个分组,分组也要进行统计。
select count(*) as pvs ,a. month as month,a.day as day,a.hour as hour from
(select distinct month, day, hour from t_ dim_ time) a
join dw_ web
l
og_ detai
l
b
on a. month=b . month and a. day=b.
d
ay and a. hour=b . hour
group by a.month,a. day,a.
hour
;
复制 sql 语句到 hive 终端中执行,可以统计出来跟时间维度表查询统计每一个小时 pvs,采用方式一的 sql 语句验证结果是否正确,完全正确,客观上呼应采用何种方式只要思路是正确的,最终的计算结果就是正确的,这就是第二种方式,虽然指标还是那个指标,但是采用两张表进行关联的方式跟时间维度表,其他的维度也是一样,
只要有需求都可以进行关联,从效果或者性能角度优先考虑单表操作,再用第二种方式。