开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段): 网站流量日志分析--统计分析--回头单次访客分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12241
网站流量日志分析--统计分析--回头单次访客分析
1、访客 visit 分析,visit 指的是用户访问网站所产生的会话,也就是 session,分析跟点击流模型相关,因为在原始数据中没有会话 session 的概念,通过预处理清理出的点击流模型中有 session 的概念。
2、统计今天的回头访客,单次访客。统计访客之前,要搞清楚次是什么,是打开页面的次数还是在网站上产生会话的次数,通过日常的工作习惯或者浏览网站的习惯,回头访客意味着来过网站之后,过一段时间再来网站叫做回头访客,因此更加贴近于实战的就是次,指的是会话的次数。
3、打开笔记,查询今日所有回头访客及其访问次数/单次访客
解读:次的理解所谓次数指的是用户会话的的次数
次数=1单次访客次数> 1回头访客
(1)数据表:ods _click_ stream_ visit
当涉及到 session 会话的概念之后,宽表原始的数据满足不了,只有点击流模型中才有 session 的概念,点击流模型中 pageviews 和 visit 都有 session,两个session 的区别是 visit 是根据 pageviews 做同一个会话的聚集,只取第一条和最后一条,在 pageviews 中 session 会有重复,而在 visit 中 session 没有重复,基于性能考虑,选择 visit 模型表。
(2)分组字段:时间维度( day)是分区字段 where
分组字段没有看出来,实际上是隐藏的,查询今天,统计今天,不需要 group by,where 即可。
(3)度量值:count(session)
判断个数,产生所谓的回头单次访客。
4、如何统计 session 用户对话的回头单次访客。
S1 |
Ip1 |
S2 |
Ip1 |
S3 |
Ip5 |
S4 |
Ip6 |
根据 ip 进行分组,相同的 ip 分为一组,在每组内做 session count,根据 count 值做判断。
--先计算每个用户产生的会话数
select
t.remote_ addr ,count(t .session)
as
nums
统计,得到每个用户以及 session 次数
from ods. c
l
ick_ ,stream_ visit t where t.datestr ="20181101" group by t.remote_ addr ;
点击流模型,起别名,针对表进行过滤,根据 ip 进行分组
5、复制打开 hive 终端进行执行,可以看到前面是 ip 后面是产生的会话次数,如果 nums 等于一表示今天的会话为一,就是单次访客,如果次数大于一,比如三个就是回流访客,在 sql 基础上做过滤,t.remote_ addr 结果是通过 sql 计算出来的,如果有个表是表 a,有两字段,一个是 t.remote_ addr,一个 nums,把 nums 大于一或者等于一的找出来,直接 select from 表 where 条件即可。
--方式一:采用嵌套查询的思路
Select
*
from
查询访问结果表
(select
t.remote_ addr as ip , count(t.session) as nums
from ods_ c1ick_ ,stream_ visit t where t. datestr ="20181101" group by t. remote_ addr) a
起别名a
where a.nums =1;
注意分号是英文分号
--单次访客
Select
*
from
查询访问结果表
(select
t.remote_ addr as ip , count(t.session) as nums
from ods_ c1ick_ ,stream_ visit t where t. datestr ="20181101" group by t. remote_ addr) a
起别名a
where a.nums
>
1;
--回头访客
通过梳理,回头访客只有两个,一个是174,一个是84,执行语句都正确。
已经得出某种结果,非常接近于最后结果,把以下代码复制执行。
select
t.remote_ addr ,count(t .session)
as
nums
from ods. c
l
ick_ ,stream_ visit t where t.datestr ="20181101" group by t.remote_ addr ;
写出每个用户所对应的会话数,在结果上进行过滤即可。
--方式二:采用 having
select
t.remote_ addr ,count(t .session)
as
nums
from ods. c
l
ick_ ,stream_ visit t where t.datestr ="20181101" group by t.remote_ addr ;
having nums = 1;
--单次访客
select
t.remote_ addr ,count(t .session)
as
nums
from ods. c
l
ick_ ,stream_ visit t where t.datestr ="20181101" group by t.remote_ addr ;
having nums >1;-
-回头访客
验证回头访客,执行,结果还是174和84,正确,
采用 having 会 更加的简单,因为已经进行了分区,再进行分组,分组完再根据结果进行过滤,having 上传使用。如果 having 用不好,一定要掌握嵌套查询,如果 having 用得好,会更加简洁。两种方式可以从 侧面验证思路或者结果是否正确,回头是两次,单次只有一次,跟会话 session 相关。