目录
数仓设计
维度建模
以维度为标准 开展数据的分析需求
适用于面向分析领域的理论。比如分析型数据库 数据仓库 数据集市(OLAP)
-
事实表
分析主题的客观事件度量 是分析主题的数据聚集 事实表中一条记录往往对应着客观的一个事件 往往是一堆主键的聚集
-
维度表
所谓的维度就是指看待问题的角度 可以通过不同的维度去分析同一个事实表 得出不同的分析结果 维度表可以跟事实表进行关联查询
本项目中数据仓库的设计
本项目中采用星型模型,事实表就是网站流量日志维度取决于业务。
事实表设计
原始数据表: ods_weblog_origin =>对应mr清洗完之后的数据
字段 | 数据类型 | 注解 |
---|---|---|
valid | string | 是否有效 |
remote_ip | string | 访客ip |
remote_user | string | 访客用户信息 |
time_local | string | 请求时间 |
request | string | 请求url |
status | string | 响应码 |
body_bytes_sent | string | 响应字节数 |
http_referer | string | 来源url |
http_user_agent | string | 访客终端信息 |
访问日志明细宽表:dw_weblog_detail
字段 | 数据类型 | 注解 |
---|---|---|
valid | string | 是否有效 |
remote_ip | string | 访客ip |
remote_user | string | 访客用户信息 |
time_local | string | 请求完整时间 |
daystr | string | 访问日期 |
timestr | string | 访问时间 |
month | string | 访问月 |
day | string | 访问日 |
hour | string | 访问时 |
request | string | 请求url整串 |
status | string | 响应码 |
body_bytes_sent | string | 响应字节数 |
http_referer | string | 来源url |
ref_host | string | 来源的host |
ref_path | string | 来源的路径 |
ref_query | string | 来源参数query |
ref_query_id | string | 来源参数query值 |
http_user_agent | string | 客户终端标识 |
维度表设计
多维度数据分析
所谓的多维数据分析就是指通过不同维度的聚集计算出某种度量值。
常见度量值:max min count sum avg topN
举个栗子:统计来自于北京女性24岁未婚的过去三年购物金额最多的前三个。
维度:地域 性别 年龄 婚姻 时间
度量值:sum(订单金额)--->top3
维度建模的三种模式
- 星型模式
一个事实表多个维度表 维度表之间没有关系 维度表跟事实表进行关联 企业数仓发展初期常见的模型
- 雪花模式
一个事实表多个维度表 维度表可以继续关联维度表 不利于后期维护 企业中尽量避免演化成该种模型
- 星座模式
多个事实表 多个维度表 某些维度表可以共用 企业数仓发展中后期常见的模型
本项目模式设计
因为项目中只有一个分析的主题:网站的流量日志情况 因此对应的事实表只有一个:网站流量日志
本项目采用星型模式
事实表:对应着数据预处理完之后的原始网站日志情况
维度表:通常要结合业务决定分析的维度 要和事实表能够关联上 要以能够涵盖事实表为基本标准
Q:问点击流模型数据算什么类型的表?
点击流模型数据既不是事实表 也不是维度表 是一个业务模型数据 可以称之为事实表的业务延伸。
数据入库ETL
创建ODS层表
- 表名通常以简短的英文表示,不用使用汉语拼音甚至中文
- 建表的时候表的字段顺序类型要和数据保持一致
- 通常企业中采用分区表进行优化,方便后续查询管理
启动 hive 连接工具 beeline
service mysqld start
nohup bin/hive --service hiveserver2 > /dev/null 2>&1
bin/beeline
!connect jdbc:hive2://node03:10000
建数据库和实体表
原始数据表
对应mr清洗完之后的数据,而不是原始日志数据
drop table if exists ods_weblog_origin;
create table ods_weblog_origin(
valid string,
remote_ip string,
remote_user string,
time_local string,
request string,
status string,
body_bytes_sent string,
http_referer string,
http_user_agent string)
partitioned by (datestr string)
row format delimited
fields terminated by ' 01';
点击流pageview表
drop table if exists ods_click_pageviews;
create table ods_click_pageviews(
session string,
remote_ip string,
remote_user string,
time_local string,
request string,
visit_step string,
page_staylong string,
http_referer string,
http_user_agent string,
body_bytes_sent string,
status string)
partitioned by (datestr string)
row format delimited
fields terminated by ' 01';
点击流visits表
drop table if exists ods_click_stream_visit;
create table ods_click_stream_visit(
session string,
remote_ip string,
inTime string,
outTime string,
inPage string,
outPage string,
referal string,
pageVisits int)
partitioned by (datestr string)
row format delimited
fields terminated by ' 01';
时间维度表
drop table if exists t_dim_time;
create table t_dim_time(date_key int,year string,month string,day string,hour string) row format delimited fields terminated by ',';
导入ODS层表数据
原始日志表
```
load data local inpath '/opt/data/sql/part-m-00000' into table ods_weblog_origin partition(datestr='20181101');
```
点击流模型之pageviews
```
load data local inpath '/opt/data/sql/part-r-00000' into table ods_click_pageviews partition(datestr='20181101');
```
点击流模型之visit
```
load data local inpath '/opt/data/sql/part-r-00000' into table ods_click_stream_visit partition(datestr='20181101');
```
时间维度表数据
```
load data local inpath '/opt/data/sql/dim_time.dat' into table t_dim_time;
```