# Hadoop离线数据分析平台实战——230项目数据存储结构设计Hadoop离线数据分析平台实战——230项目数据存储结构设计
Hadoop离线数据分析平台实战——230项目数据存储结构设计
数据存储设计
在本次项目中设计到数据存储的有三个地方: 第一个就是将原始的日志数据按天保存到hdfs文件系统中; 第二个就是将etl解析后的数据保存到hbase中; 第三个就是将分析结果保存到mysql数据库中。 其中存储到hbase和mysql的这两个过程需要设计具体的存储结构。
HBase表结构设计
由于我们需要按天进行数据分析,
所以我们的hbase的rowkey中必须包含时间戳或者我们一天的数据就建立一个表。
这里我们采用在rowkey中包含时间戳的方式来进行讲解;
另外hbase要求列簇一般尽量的少而且短,我们这里采用log来标示列簇。
所以最终我们创建一个单列簇的rowkey包含时间戳的eventlog表。
命令如下:
create 'eventlog', 'log'。rowkey设计规则为:timestamp+uuid.hashcode+random(4)
MySQL表结构设计
在mysql中我们采用维度信息表+统计分析结果表+分析辅助表三类表组成。
其中维度信息表用于存储维度相关信息,名称格式为:dimension_*
;
统计分析结果表用户存储最终的统计分析结果,以dimension维度id做主健,名称格式为:stats_*
;
分析辅助表主要用户在分析过程中使用到的其他辅助类型表。
MySql维度信息表设计
根据我们最终统计的维度信息来看,我们分别需要创建以下八个维度表: 平台维度(platform),时间维度(date),浏览器维度(browser),地域维度(location),支付方式维度(payment),货币类型维度(currency_type),event维度(event),外链维度(inbound)。 另外还分别需要一个kpi维度和一个操作系统维度(os)表。 注意os表在本次项目中不会用到。
最终统计分析模块和维度表关系
分析模块 |
相关维度表 |
---|---|
用户基本信息分析 |
platform、date |
浏览器信息分析 |
platform、date、browser |
地域信息分析 |
platform、date、location |
用户浏览深度分析 |
platform、date、kpi |
外链信息分析 |
platform、date、inbound |
订单信息分析 |
platform、date、currency_type、payment |
事件分析 |
platform、date、event |
MySql统计分析结果表设计
我们最终需要进行七个模块的数据分析, 这七个模块的展示数据最终是从我们的mysql数据库中获取的, 那么接下来就分别从这七个模块来分析对应的mysql表结构设计。
用户基本信息分析模块表结构设计
用户基本信息分析模块中要求数据库对应表有以下几个维度的数据: 新增用户数、活跃用户数、总用户数、新增会员数、活跃会员数、总会员数、会话个数、会话长度这八个统计指标, 除此之外还需要platform和date这两个维度信息id以及created字段来标示修改时间。 其中通过platform和date这两个字段信息来唯一确定表数据, 设计表名为: stats_user。 除了这个表以外,由于我们还需要统计分时段的数据信息,故还要求有一个分时存储统计数据的表,设计表名为:stats_hourly。
stats_user表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
active_users |
int(11) |
空。0 |
活跃用户数 |
new_install_users |
int(11) |
空。0 |
新增用户数 |
total_intall_users |
int(11) |
空。0 |
总用户数 |
sessions |
int(11) |
空。0 |
会话个数 |
sessions_length |
int(11) |
空。0 |
会话长度 |
total_members |
int(11) |
空。0 |
总会员数 |
active_members |
int(11) |
空。0 |
活跃会员数 |
new_members |
int(11) |
空。0 |
新增会员数 |
created |
date |
空。null |
记录日期 |
浏览器信息分析模块表结构设计
浏览器信息分析和用户基本信息分析基本类型, 也包含以下几个维度的数据: 新增用户数、活跃用户数、总用户数、新增会员数、活跃会员数、总会员数、会话个数、会话长度这八个统计指标, 除此之外还需要一个pv计数的统计指标以及platform、date、browser这三个维度信息字段和create标示修改日期的字段。 其中通过platform、date和browser这三个字段信息来唯一确定表数据。 设计表名为: stats_device_browser
stats_device_browser表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
browser_dimension_id |
int(11) |
非空,0 |
浏览器id,pkey |
active_user |
int(11) |
空,0 |
活跃用户数 |
new_install_users |
int(11) |
空,0 |
新增用户数 |
total_intall_users |
int(11) |
空,0 |
总用户数 |
sessions |
int(11) |
空,0 |
会话个数 |
sessions_length |
int(11) |
空,0 |
会话长度 |
total_members |
int(11) |
空,0 |
总会员数 |
active_members |
int(11) |
空,0 |
活跃会员数 |
new_members |
int(11) |
空,0 |
新增会员数 |
pv |
int(11) |
空,0 |
pv数 |
created |
date |
空,null |
最后修改日期 |
地域信息分析模块表结构设计
地域信息分析模块只分析活跃用户的地域分布情况以及跳出率相关分析, 故需要以下几个统计指标: 活跃用户数、会话个数、跳出会话个数。 除此之外需要platform、date、location这三个维度信息字段和create标示修改日期的字段。 其中通过platform、date和location这三个字段信息来唯一确定表数据。 设计表名为: stats_device_location
stats_device_location表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
location_dimension_id |
int(11) |
非空,0 |
地域id,pkey |
active_user |
int(11) |
空,0 |
活跃用户数 |
sessions |
int(11) |
空,0 |
会话个数 |
bounce_sessions |
int(11) |
空,0 |
跳出会话个数 |
created |
date |
空,null |
最后修改日期 |
用户浏览深度分析模块表结构设计
用户浏览深度我们通过计算访问不同数量页面的用户数/会话数来表示, 在本次项目中我们分为8个不同数量级的指标, 分别为:访问1个pv、访问2个pv、访问3个pv、访问4个pv,访问5-10个pv(包含5但不包含10),访问10-30个pv,访问30-60个pv,访问60+pv。 除此之外需要platform、date、kpi这三个维度信息字段和create标示修改日期的字段。 其中通过platform、date和kpi这三个字段信息来唯一确定表数据。 设计表名为: stats_view_depth
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
kpi_dimension_id |
int(11) |
非空,0 |
kpiid,pkey |
pv1 |
int(11) |
非空,0 |
访问1个页面 |
pv2 |
int(11) |
非空,0 |
访问2个页面 |
pv3 |
int(11) |
非空,0 |
访问3个页面 |
pv4 |
int(11) |
非空,0 |
访问4个页面 |
pv5_10 |
int(11) |
非空,0 |
访问5-10个页面 |
pv11_30 |
int(11) |
非空,0 |
访问11-29个页面 |
pv30_60 |
int(11) |
非空,0 |
访问30-59个页面 |
pv60plus |
int(11) |
非空,0 |
访问60+个页面 |
created |
date |
空,null |
最后修改日期 |
外链信息分析模块表结构设计
外链信息分析主要包括外链构成(偏好)分析和跳出率分析。 其中外链构成(偏好)我们通过活跃用户数来标示, 需要我们需要几下几个统计指标: 活跃用户数、会话个数、跳出会话个数。 除此之外需要platform、date、inbound这三个维度信息字段和create标示修改日期的字段。 其中通过platform、date和inbound这三个字段信息来唯一确定表数据。 设计表名为: stats_inbound
stats_inbound表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
inbound_dimension_id |
int(11) |
非空,0 |
外链id,pkey |
active_user |
int(11) |
空,0 |
活跃用户数 |
sessions |
int(11) |
空,0 |
会话个数 |
bounce_sessions |
int(11) |
空,0 |
跳出会话个数 |
created |
date |
空,null |
最后修改日期 |
订单信息分析模块表结构设计
订单信息分析需要分析订单数量和订单金额相关统计信息, 故需要以下几个指标的数据分析: 订单数量、成功支付的订单数量、退款订单数量、订单金额、成功支付金额、退款金额、总成功支付金额、总退款金额。 除此之外,我们还需要使用platform、date、currency_type和payment四个维度字段类表示确认唯一记录。 另外需要添加一个created字段来表示数据日期。 表名设计为:stats_order
stats_order表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
currency_type_dimension_id |
int(11) |
非空,0 |
货币类型id,pkey |
payment_type_dimension_id |
int(11) |
非空,0 |
支付类型id,pkey |
orders |
int(11) |
空,0 |
订单数量 |
success_orders |
int(11) |
空,0 |
成功支付的订单数量 |
refund_orders |
int(11) |
空,0 |
退款的订单数量 |
order_amount |
int(11) |
空,0 |
订单金额 |
revenue_amount |
int(11) |
空,0 |
支付金额 |
refund_amount |
int(11) |
空,0 |
退款金额 |
total_revenue_amount |
int(11) |
空,0 |
总的支付金额 |
total_refund_amount |
int(11) |
空,0 |
总的退款金额 |
created |
date |
空,null |
最后修改日期 |
事件分析模块表结构设计
在本次项目中,事件分析主要就是分析事件的触发次数, 故对于的数据存储结构为:times(触发次数)以及platform、date、event三个维度字段和created字段, 表名设计为:stats_event
stats_event表结构
列名 |
类型 |
默认值 |
描述 |
---|---|---|---|
platform_dimension_id |
int(11) |
非空,0 |
平台id,pkey |
date_dimension_id |
int(11) |
非空,0 |
日期id,pkey |
event_dimension_id |
int(11) |
非空,0 |
event维度id,pkey |
times |
int(11) |
空,0 |
触发次数 |
created |
date |
空,null |
最后修改日期 |
MySql表结构设计总述
我们通过维度信息表和统计分析结果表的整合来保证我们数据展示的正常性,具体创建表结果的文件参考:
..文档report.sql ;
其中我们创建数据库的命令为:CREATE DATABASE report
DEFAULT CHARACTER SET utf8 ;
- Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试
- Spark 伪分布式 & 全分布式 安装指南
- 十步完全理解 SQL
- 利用HSTS嗅探浏览器历史纪录的三个漏洞
- Verilog代码设计风格
- Yaffs_checkptrw
- 那些 Shell、Awk 中自动隐式类型转换的“坑”
- 浏览器 HTTP 协议缓存机制详解
- 详解 Windows 下 Eclipse CDT 配置 C/C++ 编译环境
- 硬核乘法器的Verilog HDL 调用
- Web 自动化测试与智能爬虫利器:PhantomJS 简介与实战
- 浅谈 Scala 中下划线的用途
- Java 多线程之 Runnable VS Thread 及其资源共享问题
- 块RAM的Verilog HDL调用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打卡群刷题总结0807——验证二叉搜索树
- 打卡群刷题总结0808——二叉树的层序遍历
- Mybatis高级查询(四):延迟加载
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历
- 简单的ssm整合练手项目:汽车项目
- 在spring-boot中使用pageHelper插件
- 要深入 JavaScript,你需要掌握这 36 个概念
- mybatis-plus实现增删改查
- mybatis-plus代码生成器
- mybatis-plus逻辑删除
- mybatis-plus一些关键配置
- mybatis-plus自定义sql注入器
- k8s代码走读---kube-controller-manager
- 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(一)