会话信息表: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 ;