网站日志流量复杂分析

网站日志流量复杂分析

需求

会话信息表:web

键名 描述 对应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 日期 分区字段

根据上面的相关信息,统计以下流量分析指标sql

日期 UV PV 登录人数 游客人数 平均访问时长 二跳率 独立IP数

实现

一、先根据会话信息在hive中建立对应的表,这里因为使用date来分区,因此能够不用在create中显示建立字段cookie

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 

二、插入数据,这里由于是根据session来分析的,因此按session来分组,由于这里的trackerU,landing_url和landing_url_ref在一个session里面有多个,可是咱们只须要取对应tracktime最小值的记录,因此必须经过二次join获得session

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 ;

三、获取原表session_info里面全部的session_id以及对应的tracktime,能够看到2中的表数据量明显少于没有作过聚合的表3,这里咱们建立表3的时候只须要选取链接的主键以及须要获得tranckerU,landing_url,landing_url_ref便可oop

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' ;

四、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 ;

五、最后的报表结果:ui

-- 日期 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 ;
相关文章
相关标签/搜索