开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段):网站流量日志分析--统计分析--独立访客分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12238
网站流量日志分析--统计分析--独立访客分析
1、需求描述:按照时间维度比如小时统计独立访客及其产生的 pv。
对于独立访容的识别,如果在原始日志中有用户标识,则根据用户标识即很好实现;此处,由于原始日志中并没有用户标识,以访客 IP 模拟,技术上是一样的,只是精确度相对较低。
访客分析指的是以用户从人的角度看待访问网站的一些相关情况指标的计算,访客分析的核心重点就是如何识别人,到网站的用户有很多,有张三李四王五,如何知道它是谁的记录,这就涉及到访客的识别,这时打开数据,在收集的数据中跟人相关的有两个字段,一个是用户的 id,一个是用户的标识,但是数据中用户的标识是缺失字段没有数据,用户标识可以用 cookie id 表示,比如每个人到网站上访问都可以生成唯一的 cookie id,cookie id 表示是不同的访客,这两个字段需要达成共识,用它们两个表示都没有问题,技术上都是完全一样的,
只不过精准度上有区别,因为一个 ip 背后可能表示不同的人,比如163.177.71.12和163.177.71.12是一个人还是两个人都不一定,所以需要沟通好,这个是访客识别,有访客之后,访客维度跟其他维度的组合进行相关的指标计算,跟页面维度相组合,跟时间维度甚至跟时间页面维度相组合,举例,统计每个人产生的Pv有多少,这种情况下只跟人相关,统计每个人每小时来访的网站,网站随时切换,就涉及到多个维度的组合。
2、打开参考资料,点击访客分析。
需求:按照时间维度来统计独立访客及其产生的 pv 量(按照小时)。
时间维度:时
drop table dw_ user_ dstc_ ip_ h;
create table dw_ user dstc_ ip_ h(
Remote_ addr string,"
Pvs bigint,
Hour string);
insert into table dw_ user_ Dstc_ ip_ h。
select remote_ addr,count(1) as pvs,concat(month,day,hour) as hour
from ods _ weblog_ detaile
Where datestr=’ 20181101’
(1)数据表:dw_ weblog. Detail
统计每小时访独立访客及其产生的pv量跟点击流模型没有关系,因为里面不涉及到会话次数的概念,再次强调它是业务模型,没有会话使用不到它。
(2)分组字段:时间维度(hour)、访客维度(remote_ addr)
每个小时,一天中有一点两点三点,二十四个小时,在一点中张三来李四也可以来,一小时中不可能都是一个人的记录,所以在每个小时中还要根据人进行分组分析出张三的李四的王五的,所以还有访客的维度。
(3)度量值:count()
确定关键字,跟所操作的表,起别名,进行分组,进行分组时时间维度和访客维度是并列的维度,两个维度的先后顺序对结果不会产生影响,只会影响最终执行的过程,因此可以先小时也可以先访客。根据两个维度分组完之后,进行统计,统计完之后看是哪个小时,把查询式写上,无论是小时还是访客都是分组字段,所以出现在表达式中不会报错,进行倒序排序。进行执行。
select
t. hour ,t. remote_ addr ,count(*) as pv
from dw_ weblog_detail t where t.datestr ="20181101" group by t .hour
t.remote_ addr order by t . hour ,p desc ;
3、打开 hive 终端进行执行,计算出每个小时的 ip 产生的 pv,可以看到23点的,打开参考资料,点击访客信息,创建中间表
create table dw user_ dstc_ ip_ h(
remote_ addr string ,
P
vs bigint ,
H
our string) ;
从宽表中进行分组,根据小时和 ip,参考资料中是把 month,day,hour 做了concat 拼接,根据拼接进行分组,如果把拼接去掉,直接根据 month,day,hour 进行分组,需求是根据小时进行分组,如果数据干净整洁对结果没有影响,因为前面的字段保护了它,通过 where 条件得到20181101,不管怎么分一定是11月的不能是12月的,根据天怎么分,一定是1号的不能是2号的,因此 month 和 day 分等于没有分,最终起决定作用的还是 hour,hour不一样就来到不同的分组中,统计完后根据 hour 的正序 pvs 倒序进行排序,最终才有 insert 加 select 语句。
insert into table dw_ user_ dstc_ ip_ h
select remote_ addr , count(1) as pvs , concat (month, day ,hour) as hour
from dw weblog detail
Where datestr= '20181101"
group by concat (month , day ,hour) , remote_ addr
order by hour asc,pvs desc ;
复制打开 hive 终端进行执行,为了验证表是否正确,可以进行查询,
select *from dw_user dstc_ip_h
当中列举出每个小时采集的 pv 大概的数据情况,数据就可以非常方便的在页面上做相关的执行。
4、在上述基础之上,可以继续分析,比如每小时独立访客总数
select count(1) as dstc_ ip_ cnts ,hour from dw_ user_ dstc_ ip_ h group by hour ;
时间维度:日
select remote_ addr ,count(1) as counts , concat (month,day) as day
from dw_ weblog_ detail
Where datestr='20181101 '
group by concat (month,day) , remote_ addr;
时间维度:月
select remote_ addr , count(1) as counts , month
from dw_ weblog_ detail
group by month, remote_ addr ;
每个小时,每天做个累加,也可以分组时把天去掉,每个月的都非常类似,统计每天把小时去掉,统计每月把天去掉或者做累加,在独立访客分析中重点需要注意两个知识点,第一个是独立访客的识别问题,用哪个字段表示访客,第二个就是分组维度多为分析的问题,确定分组维度就可以写sql语句,其他都比较简单跟之前的分析类似。