網站日誌流量複雜分析

網站日誌流量複雜分析

需求

會話信息表: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 ;
相關文章
相關標籤/搜索