一、visit模型
-》ETL
9个字段
-》Pageview模型
11个字段
sessionId,step,length
-》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
二、数据仓库及模型设计
-》什么是数据仓库?数据库有什么区别?
-》数据仓库:用于存储数据的地方
注意:数据仓库:是数据入库,数据存储,数据清洗的一系列的工作构建的体系
注意:hive官网上说是Hadoop的数据仓库,但是hive并不是它其实是实现数据仓库的一个工具。
-》数据入库
-》数据存储
-》文件系统:hdfs
-》RDBMS:hive、oracle
-》Nosql:hbase、redis
-》数据清洗
数据库(rdbms):财务部数据库、人事部数据库、业务部数据库
数据仓库:
菜农1-》蔬菜1
菜农2—》蔬菜2 -》 超市(清洗、包装) -》菜盘 -》做菜
菜农3-》蔬菜3
注意:多种来源数据入库 数据存储 数据清洗 构建模型 数据处理
注意:事实表要包含维度表
注意:事实表和维度表怎么关联决定了什么样的模型
注意:大数据都是选择星型模型进行数据仓库设计的,数据冗余其实还是有好处的,因为有利于并行化处理
注意:大数据框架是不会纠结数据的冗余,会使用星型模型一般不会用雪花模型。只有建立关系型数据库的时候才会考虑使用雪花模型。
数据仓库分层:
不同数据、不同的业务线进行不同的分层处理
hive的功能:
Hive不是数据仓库,是实现hadoop数据仓库的一个工具
是将hdfs中文件映射为表结构,然后使用Sql对表进行存储、入库、分析等一系列 的操作。
三、数据分析实现
??
visit模型(对session进行分组,每个session只有一条)
基于pv模型
visistMode.java
PVBean.java
添加分析文件
测试:
按照Day22 pv的方式打好jar包,放到linux中去
[root@bigdata-training01 hive-1.1.0-cdh5.7.6]# bin/beeline
Beeline version 1.1.0-cdh5.7.6 by Apache Hive
beeline> !connect jdbc:hive2://192.168.150.222:10000
scan complete in 2ms
Connecting to jdbc:hive2://192.168.150.222:10000
Enter username for jdbc:hive2://192.168.150.222:10000: root
Enter password for jdbc:hive2://192.168.150.222:10000: ****
create database if not exists weblog;
use weblog;
drop table if exists weblog_origin;
create table weblog_origin(
valid string,
ip string,
user_id string,
time string,
request string,
status string,
body_size string,
http_ref string,
user_agent string)
partitioned by (datestr string)
row format delimited
fields terminated by '\001';
load data local inpath '/opt/datas/part-r-etl' into table weblog_origin partition (datestr='20180531');
show tables;
desc weblog_origin;
select ip,time,body_size from weblog_origin limit 10;
select valid,ip,time,body_size,status from weblog_origin limit 10;
visist模型
drop table if exist click_visit;
create table click_visit(
session string,
ip string,
inTime string,
outTime string,
inPage string,
outPage string,
refere string,
pageNum int)
partitioned by (datestr string);
load data local inpath '/opt/datas/part-r-visit' into table click_visit partition (datestr='20180531');
分析表weblog_detail
drop table weblog_detail;
create table weblog_detail(
valid string, --有效标识
ip string, --来源IP
user_id string, --用户标识
time string, --访问完整时间
daystr string, --访问日期
timestr string, --访问时间
month string, --访问月
day string, --访问日
hour string, --访问时
request string, --请求的url
status string, --响应码
body_size string, --传输字节数
http_ref string, --来源url
ref_host string, --来源的host
ref_path string, --来源的路径
ref_query string, --来源参数query
ref_query_id string, --来源参数query的值
user_agent string --客户终端标识
)partitioned by(datestr string);
insert overwrite table weblog_detail partition (datestr='20180531')
select
c.valid,c.ip,c.user_id,c.time,
substring(c.time,0,10) as daystr,
substring(c.time,12) as timestr,
substring(c.time,6,2) as month,
substring(c.time,9,2) as day,
substring(c.time,12,2) as hour,
c.request,
c.status,
c.body_size,
c.http_ref,
c.ref_host,
ref_path,
ref_query,
ref_query_id,
c.user_agent
from
(
select
a.valid,
a.ip,
a.user_id,
a.time,
a.request,
a.status,
a.body_size,
a.http_ref,
a.user_agent,
b.ref_host,
b.ref_path,
b.ref_query,
b.ref_query_id
from
weblog_origin a
LATERAL VIEW
parse_url_tuple(regexp_replace(http_ref,"\"",""),'HOST','PATH','QUERY','QUERY:id') b
as ref_host,ref_path,ref_query,ref_query_id
) c where c.time != 'null';
parse_url_tuple用法
desc function formatted parse_url_tuple;
ref_host string, --来源的host
ref_path string, --来源的路径
ref_query string, --来源参数query
ref_query_id string, --来源参数query的值
https://search.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC%20%E8%BD%BB%E8%96%84%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC%20%E8%BD%BB%E8%96%84%E6%9C%AC&pvid=r66frrzi.8skclkfr08v5ve2
'HOST',:来源地址 search.jd.com
'PATH',:Search
'QUERY',keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC%20%E8%BD%BB%E8%96%84%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC%20%E8%BD%BB%E8%96%84%E6%9C%AC&pvid=r66frrzi.8skclkfr08v5ve2
'QUERY:enc' utf-8
regexp_replace的用法
select parse_url_tuple(regexp_replace(http_ref,"\"",""),'HOST','PATH','QUERY','QUERY:id') from weblog_origin limit 10;
regexp_replace将” ”替换为空:
select regexp_replace(http_ref,"\"","") from weblog_origin limit 10;
0: jdbc:hive2://192.168.150.222:10000> use weblog;
0: jdbc:hive2://192.168.150.222:10000> show tables;
select daystr,timestr,ref_host,ref_path from weblog_detail limit 10;