Hive日志分析案例
2017-12-04 15:53
267 查看
日志分析案例
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....
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....