首页 > 技术文章 > 网站流量日志分析(模块开发——数据仓库设计)

alidata 2020-08-10 15:55 原文

数仓设计

维度建模

以维度为标准 开展数据的分析需求
适用于面向分析领域的理论。比如分析型数据库 数据仓库 数据集市(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 '\001';

点击流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 '\001';

点击流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 '\001';

时间维度表

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;
```

推荐阅读