會話信息表: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 ;