您的位置:首页 > 其它

Hive日志分析案例

2017-12-04 15:53 190 查看
日志分析案例
1、分析流程
-》需求分析
-》数据采集
-》数据清洗
-》数据分析
-》结果展示
2、【需求分析】
-》日期
-》按照日期进行分组,基于时间维度的分析
-》可以考虑建分区表,分区给定日期
-》登录人数,代表的就是会员,使用账号登录的人
-》登录之后会产生一个会员ID
-》处理的时候可以看会员ID有没有值
-》PV
-》count(url)
-》UV
-》count(distinct(guid))
-》平均访问时长
-》当进入页面开始会在后台开启一个会话,sessionID生成
-》会话关闭代表sessionID失效,再次建立会话,会生成不同的sessionID
-》进入页面的第一条记录的时间戳和最后离开的最后一条记录的时间戳,进行相减得到访问时长
-》再对session进行分组,最后求得平均访问时长
-》二跳率
-》一个用户在一个session会话中点击了大于等于2的网页数量
-》一个页面就是一个PV,PV大于等于2的统计,再除以总的人数
-》独立IP
-》distinct(ip)

预期:

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

3、【数据采集】

-》建库

create database yhd;

-》建源表

create table yhd_source(

id              string,

url             string,

referer         string,

keyword         string,

type            string,

guid            string,

pageId          string,

moduleId        string,

linkId          string,

attachedInfo    string,

sessionId       string,

trackerU        string,

trackerType     string,

ip              string,

trackerSrc      string,

cookie          string,

orderCode       string,

trackTime       string,

endUserId       string,

firstLink       string,

sessionViewNo   string,

productId       string,

curMerchantId   string,

provinceId      string,

cityId          string,

fee             string,

edmActivity     string,

edmEmail        string,

edmJobId        string,

ieVersion       string,

platform        string,

internalKeyword string,

resultSum       string,

currentPage     string,

linkPosition    string,

buttonPosition  string

)

partitioned by (date string)

row format delimited fields terminated by '\t'

stored as textfile;

-》加载数据

load data local inpath '/opt/datas/2015082818' into table yhd_source partition(date='2015082818');

4、【数据清洗】
-》访问渠道:就是指访问的方式,通过什么方式进来访问网页的
-》比如:收藏夹、百度、手敲网页等等....
-》一定是第一条记录的值才有意义

建表:

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

-》临时表(1)

create table session_tmp as 

select 

sessionId session_id,

max(guid) guid,

max(endUserId) user_id,

count(distinct url) pv,

(unix_timestamp(max(trackTime))-unix_timestamp(min(trackTime))) stay_time,

min(trackTime) min_trackTime,

max(ip) ip,

max(provinceId) provinceId

from yhd_source where date='2015082818' 

group by sessionId;

=============================================

count(distinct url) pv获取每一个session的PV,最后进行累加统计总的PV

每个session都会有第一个记录和最后一个记录,用最后的记录减去第一个记录得到的就是这个session的停留时间

-》临时表(2)

create table track_tmp as 

select 

sessionId session_id,

trackTime trackTime,

url landing_url,

referer landing_url_ref,

trackerU trackerU

from yhd_source where date='2015082818';

============================================

通过每一条的时间和session_tmp表的最小时间进行join,join上了后track_tmp表的时间记录就是第一条的记录

然后获取三个字段

从源表中的每条记录都获取五个字段

trackTime中包含了min_trackTime,所以join的实现可以让它们相等,前提是都是同一个sessionID

-》join实现

insert overwrite table session_info partition(date='2015082818') 

select 

a.session_id session_id,

max(a.guid) guid,

max(b.trackerU) trackerU,

max(b.landing_url) landing_url,

max(b.landing_url_ref) landing_url_ref,

max(a.user_id) user_id,

max(a.pv) pv,

max(a.stay_time) stay_time,

max(a.min_trackTime) min_trackTime,

max(a.ip) ip,

max(a.provinceId) provinceId

from session_tmp a join track_tmp b on 

a.session_id = b.session_id and a.min_trackTime = b.trackTime 

group by a.session_id;

============================================

加上group by a.sessionId为了避免实际的数据产生差错率,产生误差

-》建两张临时表,实现join生成数据-》再放入session_info表中

-》需要获取trackerU、landing_url、landing_url_ref

-》sessionId session_id,trackTime trackTime字段是为了实现join

-》将所有值拿出来,不按照session进行分组,可以理解为作为一个全的集合,来获取其中的子集合

-》大表拆小表,工作中常用的一种手段

5、【数据分析】

-》建表

create table result1 as 

select 

date date,

sum(pv) PV,

count(distinct guid) UV,

count(distinct case when user_id is not null then guid else null end) login_user,

count(distinct case when user_id is null then guid else null end) visitor,

avg(stay_time) avg_time,

count(case when pv>=2 then session_id else null end)/count(session_id) second_jump,

count(distinct ip) IP

from session_info 

where date='2015082818' 

group by date;

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

select * from result1;

2015082818      36420.0 23928   23928   0       49.74171774059963       0.25886201755838995     19174

注:游客人数为0了 考虑哪里出错了。

create table result2 as 

select 

date date,

sum(pv) PV,

count(distinct guid) UV,

count(distinct case when length(user_id)!=0 then guid else null end) login_user,

count(distinct case when length(user_id)=0 then guid else null end) visitor,

avg(stay_time) avg_time,

count(case when pv>=2 then session_id else null end)/count(session_id) second_jump,

count(distinct ip) IP

from session_info 

where date='2015082818' 

group by date;

select * from result2;

注:由于源数据可能包含 null的情况

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

2015082818      36420.0 23928   11586   12367   49.74171774059963       0.25886201755838995     19174

-》一般还会在数据分析之前将数据进行过滤,清洗脏数据,去除非法数据

-》可以考虑先写几个简单的MR程序,进行数据的过滤

-》第一考虑简单性

-》第二考虑效率问题

-》一般在实际的工作中,开可以建外部表

思考:

-》不同会话的session的个数-》考虑划分区域

0-10秒有多少个session 10-20,20-30....





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: