网站日志流量复杂分析
Posted Raymoc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网站日志流量复杂分析相关的知识,希望对你有一定的参考价值。
网站日志流量复杂分析
需求
会话信息表:
键名 | 描述 | 对应Track表字段 |
---|---|---|
session_id | 会话ID | sessionId,会话ID |
guid | 访客id | globel userId,独立访客ID,不清cookies时不会变化guid |
trackerU | 访问的渠道id,取该会话中第一个trackerU | trackerU 渠道 |
landing_url | 着落页,第一个访问URL | url |
landing_url_ref | 着落页之前的页面,用于分析引流 | refere |
user_id | 用户id | endUserId |
pv | 网站pv | page_views |
stay_time | 停留时间,秒 | |
min_trackTime | 最小时间(第一次访问时的时间) | |
ip | ip地址 | ip |
provinceId | 省份ID | provinceId |
date | 日期 | 分区字段 |
根据上面的相关信息,统计如下流量分析指标
日期 | UV | PV | 登陆人数 | 游客人数 | 平均访问时长 | 二跳率 | 独立IP数 |
---|---|---|---|---|---|---|---|
实现
1、先根据会话信息在hive中创建对应的表,这里由于使用date来分区,所以可以不用在create中显示创建字段。
drop table if exists db_track.session_info ;
create table db_track.session_info(
session_id string ,
guid string ,
trackerU string ,
landing_url string ,
landing_url_ref string ,
user_id string ,
pv string ,
stay_time string ,
min_trackTime string ,
ip string ,
provinceId string
)
partitioned by (date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t
2、插入数据,这里因为是根据session来分析的,所以按session来分组,因为这里的trackerU,landing_url和landing_url_ref在一个session里面有多个,但是我们只需要取对应tracktime最小值的记录,所以必须通过二次join得到
use db_track ;
drop table if exists tmp_session_info ;
create table tmp_session_info as
select
a.sessionid session_id,
max(a.guid) guid,
-- trackerU ,
-- landing_url ,
-- landing_url_ref ,
max(a.enduserid) user_id,
count(a.url) pv,
(unix_timestamp(max(a.tracktime)) - unix_timestamp(min(a.tracktime))) stay_time,
min(a.tracktime) min_trackTime,
max(a.ip) ip,
max(a.provinceid) provinceId
from track_log a
where date = ‘20160319‘
group by a.sessionid ;
3、获取原表session_info里面所有的session_id以及对应的tracktime,可以看到2中的表数据量明显少于没有做过聚合的表3,这里我们创建表3的时候只需要选取连接的主键以及需要得到tranckerU,landing_url,landing_url_ref即可
use db_track ;
drop table if exists tmp_track_url ;
create table tmp_track_url as
select
sessionid ,
tracktime ,
trackeru ,
url ,
referer
from track_log
where date = ‘20160319‘ ;
4、join 2和3中的表,报表需要信息的基本表:
-- insert into table
use db_track ;
insert overwrite table session_info partition(date = ‘20160319‘)
select
a.session_id session_id,
max(a.guid) guid,
max(b.trackeru) trackerU,
max(b.url) landing_url,
max(b.referer) landing_url_ref,
max(a.user_id) user_id,
max(a.pv) pv,
max(a.stay_time/1000) stay_time,
max(a.min_tracktime) min_trackTime,
max(a.ip) ip,
max(a.provinceid) provinceId
from tmp_session_info a
join tmp_track_url b
on a.session_id = b.sessionid and a.min_tracktime = b.tracktime
group by a.session_id ;
5、最后的报表结果:
-- 日期 UV PV 登录人数 游客人数 平均访问时长 二跳率 独立IP数
use db_track ;
drop table if exists tmp_visit_daily ;
create table tmp_visit_daily as
-- process
select
date ,
count(distinct guid) uv ,
sum(pv) pv ,
count(distinct case when user_id is not null then user_id else NULL end) login_users ,
count(distinct case when user_id is null then guid else NULL end) visit_users ,
avg(stay_time) avg_stay_time ,
count(case when pv >= 2 then session_id else NULL end)/count(session_id) second_rate ,
count(distinct ip) ip_number
from session_info
where date = ‘20160319‘
group by date ;
以上是关于网站日志流量复杂分析的主要内容,如果未能解决你的问题,请参考以下文章