跳至主要內容

数仓建模架构

Znyoung大数据保险项目数据仓库建模数仓分层

day03_保险项目课程笔记

今日内容:

  • 1- 数据仓库的基本介绍
  • 2- 维度分析相关内容
  • 3- 数仓建模相关内容
  • 4- 缓慢渐变维
  • 5- 数仓分层架构
  • 6- 项目环境搭建工作
  • 7- 完成基础数据集导入操作

1. 数据仓库的基本介绍

  • 1- 何为数据仓库呢?
	存储数据的仓库, 主要是用于存储过去历史发生过的数据, 基于主题对数据进行分析操作, 通过对过去历史数据的分析,从而能够对未来提供决策支持
  • 2- 数据仓库最大的特点:
	既不生产数据也不消耗数据, 数据来源于各个数据源
  • 3- 数据仓库的四大特征:
面向于主题:  分析什么 , 什么就是你的主题
集成性: 指的数据从各个数据源来 将各个数据源的数据全部汇聚在一起, 格式不尽相同
非易失性(稳定性) : 存储都是过去既定发生过的数据, 这些数据一般不会发生修改
时变性: 随着时间的推移, 原有分析的手段无法适应未来分析操作, 需要进行改变分析方案,同时数据也会进行新增操作
  • 4- OLTP 和 OLAP 区别:
OLTP: 关系型数据库(联机事务处理)
	面向于事务,业务
	捕获数据
	存储最近发生的数据
	交互式处理, 延迟比较低
OLAP: 数据仓库 (联机分析处理)
	面向于主题
	分析数据
	存储过去历史数据
	批处理,延迟比较高
  • 5- 何为ETL:
ETL: 抽取  转换  加载


狭义上ETL:
	指的数据从ODS层将数据抽取出来, 对数据进行清洗转换处理的操作, 将清洗转换后的数据加载到DW层过程

宽泛上ETL: 只要操作存在抽取 转换 加载的过程 认为属于ETL范畴
	指的整个数仓的全过程
  • 6- 数据仓库和数据集市
	数据仓库是包含数据集市的, 一般来说数据集市指的是基于主题/部门的统计过程, 称为一个集市
	
	数据仓库指的构建集团的数据中心

2. 维度分析

  • 维度:
指的: 
	分析问题的角度, 比如说: 分析过去10年订单, 可以从地区, 时间, 用户,店铺, 商圈等等

维度分类: 
	定性维度: 主要指的统计每天, 各个这样相关的维度
		比如说: 统计每天的订单量, 此时 时间(天) 就是一个定性维度
		定性维度在SQL上表现一般是放置 group by中
	定量维度: 主要指的统计某一个具体的范围, 或者具体的值的维度
		比如说: 统计年龄在10~20岁区间 性别为男, 每天的消费费用
			年龄 和 性别 属于 定量维度
			每天 属于 定性维度
		如果确定是定量维度, 一般在SQL中放置在where条件中

分层和分级: 
	比如说, 根据地区维度进行统计, 此时对地区再次细化: 省份, 城市, 县区...

上卷和下钻:  必须要有一个衡量的标准 
	比如说: 以天为例, 上卷统计, 统计 月  年  下钻统计: 统计 小时
	

说明:
	不管是上卷还是下钻, 不管是分层还是分级, 本质上都是在统计分析的时候, 让维度变得更多了
  • 指标:
指的: 
	指标是衡量事务发展的标准,也叫度量值

常见的指标的主要两大类: 
	绝对指标: 指的计算出具体值的操作, 比如 计算销售额, 订单量
		sum() max() min() avg() count() .....
	相对指标: 指的不需要计算出具体的值, 更多是一些相对结果, 比如说 环比增长率, 转换率  流失率 同比增长
		如果后续的指标都是一些相对指标, 可以对数据进行采样计算的

3. 数仓建模

何为数仓建模: 指的如何在数据仓库中构建表

可以说, 数仓建模其实就是规范化如何建表一套理论支持

  • 三范式建模:
	三范式建模更多是应用传统业务环境中, 关系型数据库中的, 主要规定了: 表应该都要有主键, 在构建过程中尽量避免数据冗余发生, 尽量拆分表....
  • 维度建模:
	维度建模主要是应用在分析性的数据库中, 比如数据仓库, 规定在进行建模的过程中, 以分析为前提, 只要是能够利于分析的, 就是好的建模方案, 在建模过程中, 允许数据出现一定的冗余
image-20220109102659826.png
image-20220109102659826.png

维度建模主要分为有二种类型的表:

  • 事实表:
	事实表: 
		反应用户行为的数据的表一般都是事实表
		基于什么来统计分析, 什么就是我们的主题, 而主题所对应这些表, 一般都是事实表,或者说用于计算指标的表
		事实表内部一般都是有大量的外键字段的
	
	事实表分类:  了解
		事务事实表:  最初始的事实表, 从业务中所确定出来事实表, 一般都是 事务事实表
		周期快照事实表: 指的那些进行了提前聚合之后的事实表或者结果表
			项目一的, 在DWS层, 形成了日统计宽表  后续在计算效率更高  DM层, 计算月 年
		累计快照事实表: 表中每一条记录反应了一个事件从开始到结束整个生命周期全过程
  • 维度表:
	维度表:
		在基于事实表进行统计分析的时候, 需要关联到其他的表, 这些表都是维度表
        维度表一般都是平台或者系统自建的一些表
    
    维度表分类: 
    	低基数维度表:  指的数据量一般只有几十条到几千条或者数据条数比较稳定的表
    	高基数维度表:  指的数据量一般都是万级别或者 千万级别数据表

在维度建模中, 有三种反应数仓发展模式:

  • 星型模型:
    • 特点:  只有一个事实表, 也就意味着只有一个分析的主题, 在事实表周围围绕了多个维度表, 维度表与维度表之间没有任何的关联
    • 数仓发展: 初期
  • 雪花模型:
    • 特点:  只有一个事实表, 也就意味着只有一个分析的主题,在事实表周围围绕了多个维度表, 维度表可以接着关联其他的维度表
    • 数仓发展: 数仓发展进入畸形状态, 在数仓构建中, 尽量避免出现这种模型
  • 星座模型:
    • 特点:  有多个事实表, 也就意味着有了多个分析的主题, 在事实表周围围绕了多个维度表, 当条件吻合情况下, 多个事实表之间是可以共享维度表
    • 数仓发展: 中 后 期
image-20220109112514219.png
image-20220109112514219.png

4. 缓慢渐变维

作用: 解决历史变更数据是否需要存储的问题

思考: 如果不存储历史数据, 只存储最新数据即可, 有什么问题呢?    会导致分析的结果不准确


举个栗子: 
	比如说: 有一个哥们居住在北京, 在2021-01月 到 2021-06月份共计消费10w ,在2021-07月份从北京搬家到三亚, 在2021-07~2021-12月份 在三亚花费10w
	
	如果没有维护用户历史变化, 在2022年进行统计分析这一年的各个地区的销售总额的时候, 用户表仅存储这个哥们在三亚居住,并不知道其有半年是在北京居住
	在进行统计的时候, 会将其在北京花费的10w元, 计入到三亚的消费中, 导致北京地区销售总额少了10w , 而三亚变多了
	
	
如果维护了整个历史变化行为, 此时我们就可以精确计算出各个地区的销售额

如何实现历史变化的维护操作. 主要提供了三种方案:

  • SCD1:  不维护历史变化, 直接覆盖操作, 仅适用于错误数据的处理操作
  • SCD2: 也被称为 拉链表, 会维护历史变更行为
	在表中多加两个字段, 一个是开链时间(起始时间|生效时间) 一个闭链时间(截止时间|失效时间), 一旦发现有数据变更, 首先会将上一条记录闭链时间从 9999-99-99 变更为当天时间上一天即可, 然后新增一条当前最新的数据, 此时开链时间为当天的时间, 闭链时间为 9999-99-99
	
好处:  
	可以维护更多的历史变化行为
	实现比较简单 (left join 和 union all)

弊端: 
	数据冗余程度比较高,占用磁盘空间较大
  • SCD3: 会维护历史变更行为
	当数据发生变更的时候, 通过修改表的结构, 增加一个新的字段, 记录最新的数据即可

好处: 
	尽量减少数据冗余的情况

弊端: 
	无法保存太多历史版本
	维护不方便
	效率比较低

适用于:
	磁盘空间不充足, 需要保留历史版本比较少的情况 


如果磁盘充足的, 建议都使用拉链表解决方案

5. 数据仓库的分层架构

  • 为什么要进行数仓分层呢?
1- 结构规整, 利于维护
2- 提升开发效率
3- 进行业务的划分, 功能划分
  • ODS层: 数据源层(贴源层)
	数据源层: 对接数据源, 一般会和数据源保持相同粒度, 将数据源中完整的拷贝到ODS层中, 一般在构建ODS层的时候, 会加一个分区的字段, 用于标记数据是在何时抽取到数据仓库中
  • DW层: 数据仓库层
	数据仓库层:  数据来源于 ODS层, 需要对ODS层进行清洗转换处理的操作, 将数据加载到DW层中, 在DW层更多基于数据进行统计分析处理的操作
	如果业务比较复杂 一般在DW层再次进行细化的分层操作
  • app|da|rpt|ads层: 数据应用层
	数据应用层:  用于对接上层应用, 数据是来源于DW层分析之后的结果数据, 此层一般会根据上层应用需要什么指标的结果数据, 从DW层抽取出对应的结果数据, 放置到数据应用层中

当前保险项目其实就是基于以上三层进行构建的, 并没有复杂的分层

原因:
	当前项目是基于spark SQL来进行统计分析, spark SQL 擅长进行不断迭代计算操作, 有时候直接通过一个应用程序完成整个计算流程, 所以整个保险项目中分层架构没有那么明显
image-20220109144513675.png
image-20220109144513675.png

6. 项目环境 搭建工作

6.1. pycharm构建环境:

6.1.1 清洗项目的所有的远端环境:

  • 1- 清洗所有的远端环境
image-20220109145724213.png
image-20220109145724213.png
image-20220109145821717.png
image-20220109145821717.png
image-20220109150019477.png
image-20220109150019477.png

删除后, 一路点击确定ok. 关闭界面

  • 2- 清理所有的远端连接:
image-20220109150143057.png
image-20220109150143057.png
image-20220109150257289.png
image-20220109150257289.png

最后关闭当前项目:

image-20220109150325116.png
image-20220109150325116.png
image-20220109150420283.png
image-20220109150420283.png
image-20220109150512166.png
image-20220109150512166.png

6.1.2 基于远端环境构建空白项目环境

image-20220109150652560.png
image-20220109150652560.png
image-20220109151133803.png
image-20220109151133803.png
image-20220109151328691.png
image-20220109151328691.png
image-20220109151415743.png
image-20220109151415743.png
image-20220109151816858.png
image-20220109151816858.png
image-20220109152140074.png
image-20220109152140074.png

配置自动提交本地代码到远端:

image-20220109152254460.png
image-20220109152254460.png

如果后续校验发现, 本地代码和远端不匹配, 此时性需要手动进行上传操作:

image-20220109152350650.png
image-20220109152350650.png

最后, 配置一下pycharm的py脚本模板:

image-20220109152617350.png
image-20220109152617350.png
from pyspark import SparkContext,SparkConf
from pyspark.sql import SparkSession
import os

# 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ["PYSPARK_PYTHON"]="/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"]="/root/anaconda3/bin/python"

# 快捷键:  main 回车
if __name__ == '__main__':
    print("pyspark模板")

6.1.3 构建项目基本目录环境

image-20220221153803719.png
image-20220221153803719.png

6.2 基于pycharm连接各个服务器

目的: 基于pycharm实现对远端文件的管理操作, 以及替换CRT操作命令界面

6.2.1: 首先配置连接服务器的信息

image-20220109155252870.png
image-20220109155252870.png
image-20220109155406166.png
image-20220109155406166.png

配置其他的远端服务器地址:

image-20220109155704605.png
image-20220109155704605.png
image-20220109155813988.png
image-20220109155813988.png
image-20220109155845161.png
image-20220109155845161.png
image-20220109155915013.png
image-20220109155915013.png

第三台配置与第二台是一模一样的操作

说明:

image-20220109160245242.png
image-20220109160245242.png
在pycharm中.我们可以直接基于上面目录, 完成对远端文件进行上传 下载 修改  移动 复制, 改名, 修改权限 等等相关操作, 只要是文件系统支持的操作, 在pycharm基本都是可以实现的

如果要进行上传或者下载, 直接拖拽即可完成(仅支持在pycharm内部)

6.2.2 尝试打开多个控制台

image-20220109160750130.png
image-20220109160750130.png
image-20220109160823401.png
image-20220109160823401.png
image-20220109161005252.png
image-20220109161005252.png

6.3 基于pycharm连接 mysql和 spark SQL

6.3.1 连接 mysql

image-20220109161204641.png
image-20220109161204641.png
image-20220109161336036.png
image-20220109161336036.png
image-20220109161406255.png
image-20220109161406255.png

6.3.2 连接 spark

  • 1- 启动 hadoop环境:
node1: 
	任意位执行: start-all.sh
	
执行后 需要校验各个节点是否启动成功:
node1: 
	NameNode
    ResourceManager
    NodeManager
    DataNode
node2: 
	NodeManager
    DataNode
    SecondaryNameNode
node3: 
	NodeManager
    DataNode	

OK后, 需要打开浏览器:  node1:9870 和 node1:8088 
node1:9870:
	需要校验 安全模式是否退出(30s时间)
	需要校验 datanode节点存活数量是否3个

node1:8088:
	需要校验: active 从节点为 3个
  • 2- hive的metastore
node1: 
cd /export/server/hive/bin
nohup ./hive --service metastore &

启动后, 一定要看一下有runjar的产生, 建议等待一分钟后 在通过 jps查看一次
  • 3- 启动spark的thrift server服务(模拟 hive的 hiveserver2)
node1:

cd /export/server/spark/sbin
./start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000 \
--hiveconf hive.server2.thrift.bind.host=node.itcast.cn \
--master local[2]

启动后, 通过 jps查看, 必须看到: SparkSubmit
  • 4- 通过 pycharm连接spark
image-20220109162323122.png
image-20220109162323122.png
image-20220109162431380.png
image-20220109162431380.png
image-20220109162458432.png
image-20220109162458432.png

7. 完成基础数据集的导入操作(生产中基本不存在)

指的: 将数据源的数据导入到MySQL中

image-20220930215315584.png
image-20220930215315584.png
  • 1- 将insurance.sql 复制到项目的 _01_mysql_data 目录中
image-20220109164605516.png
image-20220109164605516.png
  • 2- 执行 SQL脚本
image-20220109164655742.png
image-20220109164655742.png
image-20220109164718761.png
image-20220109164718761.png

成果:

image-20220109164835241.png
image-20220109164835241.png

表说明:

area全国行政地区表
claim_info理赔信息表
mort_10_13中国人身保险业经验生命表(2010-2013)
dd_table行业25种重疾发生率
pre_add_exp_ratio预定附加费用率
prem_std_real标准保费真实参照表
prem_cv_real保单价值准备金毛保险费,真实参照表
policy_client客户信息表
policy_benefit客户投保详情表
policy_surrender退保记录表

将mysql的数据导出到文件中操作(无需执行):

mysqldump -uroot -p --databases insurance  >/opt/insurance/1_data_mysql/insurance.sql
上次编辑于:
贡献者: 麦正阳