一、ETL结果
-》功能:只有Mapper程序
大部分情况下都是对数据进行过滤和格式化
-》字段过滤
-》字段补全
-》字段格式化
结果
标志字段
ip
user_id
time
url
status
body_size
http_ref
true1.80.249.223-2013-09-18 07:57:33/hadoop-hive-intro/20014764"http://www.google.com.hk/url?sa=t&rct=j&q=hive%E7%9A%84%E5%AE%89%E8%A3%85&source=web&cd=2&ved=0CC4QFjAB&url=%68%74%74%70%3a%2f%2f%62%6c%6f%67%2e%66%65%6e%73%2e%6d%65%2f%68%61%64%6f%6f%70%2d%68%69%76%65%2d%69%6e%74%72%6f%2f&ei=5lw5Uo-2NpGZiQfCwoG4BA&usg=AFQjCNF8EFxPuCMrm7CvqVgzcBUzrJZStQ&bvm=bv.52164340,d.aGc&cad=rjt""Mozilla/5.0(WindowsNT5.2;rv:23.0)Gecko/20100101Firefox/23.0"
二、page view 模型
目标:基于session,每一条访问记录的停留时间,步长
-》基于session,每一条访问记录的停留时间,步长
-》基于etl数据:
-》sessionId:在本次项目中自己创建,实际工作中日志中已包含该字段
-》length:每个页面停留时长
当前页面停留时长=下一个页面的访问时间-当前页面的访问时间
session1 user1 url1 2018-05-28 12:00:00
session1 user1 url2 2018-05-28 12:02:23
session2 user1 url2 2018-05-29 12:02:23
需求:
-》最后一条记录的停留时长?
-》一般给默认值
-》如果下一个页面的访问时间与我当前页面的时间差大于session的超时时间?
-》这两条记录不能属于同一个session
-》当前页面为第一个session的最后一个页面
-》session超时时间:30分钟
-》step:步长
-》编程分析
input:从hdfs读etl以后的数据
map :
key:用户id(实际工作中使用访客id,用ip代替用户)
value: 每条记录
user1 url1 2018-05-28 12:00:00
user1 url2 2018-05-28 12:02:23
user1 url2 2018-05-29 12:02:23
shuffle:
key value
用户 {recoder1、recorder2……}
Reduce
key null
value 每个用户下的所有记录
-》每个用户调用一次reduce
-》按照时间对用户的所有访问记录进行排序
-》生成sessionId/length/step
output
三、visit模型
目标
session
起始时间:访问第一个页面的时间
结束时间:访问最后一个页面的时间
进入页面:访问的第一个页面
离开页面:访问的最后一个页面
访问页数:每个session中所有的记录数
ip
用户id
来源页面:访问的第一个页面的前一个页面
代码实现
input:读取pageview模型的输出
map:
key:session
value:所有记录(pvbean)
shuffle
session {record1、record2……}
reduce:
-》按照step进行排序
sessionid:key
起始时间:beans.get(0).getTime
结束时间:beans.get(beans.size() -1).getTime
进入页面:beans.get(0).getRequest
离开页面:beans.get(beans.size()-1).getRequest
访问页数:beans.size
ip
用户id
来源页面:beans.get(0).getHttp_ref