建模

  1. 熟悉业务
    MySQL保存的不是行为数据,而是实体数据,状态数据。

数据源-》数据加工-》数据统计-》数据分析-》数据展示-》数据决策

为什么分多成,因为一个指标可能要重复运算

数据采集当天计算所以要求数据采集占用时间短,所以ods与采集到的数据格式尽可能不变

  1. 存储方式
  2. 数据格式
  3. 压缩方式
    有些可以变
  4. 融合异构
  5. 汇总不同时间数

数仓目的是分析
分层设计为了使数据体系更加清晰,便于管理。

因为有很多数据重复所以有维度dim

  1. er:使用面向对象的方式设计表在
  2. 1对多的关系,多的表中建外键比在多的表中建外键查询更高效。
  3. 1对1:主外键相同
  4. 多对多采用两张表很难实现,第三张表中建立两个外键,分别指向主表和从表。

3nf
函数依赖

1nf:每个属性都只包含一个值。不可分解。
2nf:在1nf基础上,非主属性不能直接依赖于主键。
3nf:在2nf基础上,任何非主属性不能传递依赖于主键。

er模型表太多,不适合统计分析,所以需要维度建模进行分层设计。

  1. 维度:
  2. 数据统计:汇总数据(行为的结果)——–事实表
  3. 数据分析:角度(状态)———维度表

分层设计是逻辑分层,按表名分层。

ods主要存储所以用gzip压缩效率较高,且不用格式转换,且不用格式转换就可以建表
指定表位置方便管理
为什么用外部表?
看是否有别人一起用
分区表:按时间分区,方便查询,提高查询效率。(不用分区,会生成多文件,大文件,查询时会扫描所有文件,效率低)
分区字段不会存到文件会放到路径中,所以使用采用分区表
设置严格的权限控制,防止误操作
日志表字段怎么选?
如果json属性和表字段相同,可以正常解析
如果json属性少表字段存在的可以正常解析不存在的解析为null
如果json属性多表字段不存在的不解析
如果json属性和表字段不区分大小写,可以正常解析

所以json表字段选最外层json对象属性为表字段,它是json的结构,所以用特殊类型

map 与 struct 区别
map:value类型统一,key个数可以变
struct:value类型可以不统一,key个数固定

时间戳,10位为秒,13位为毫秒用bigint存储

因为 datebase,table 属性与业务无关所以建表时不要

ods是数仓数据源,dim和dwd才是统计分析数据源

dim表:
应该为列存储适合统计,hive:orc
所以压缩应该snappy
全量
状态数据为了避免出现问题最好每天存一份全部数据(绝大多数都维度表是全量表)
拉链
维度表
把有关联维度放到一张维度表,避免关联查询
如果维度表特别简单,可以不建维度表,直接在事实表中关联
只要可以用来分析的维度都是字段
确定字段来源(参考业务数据库的字段)
主维度:业务数据库主要分析字段的表
相关维度:业务数据库中存在关联关系的表
确定维度表字段:
字段越多越好(列存储不会影响查询效率)
编码和文字共存,
沉淀(计算)出通用属性

记得装载数据用 insert overwrite,不要用 insert into,因为insert into会导致数据重复。

数仓经常需要统计历史数据所有需要存储历史维度

全量快照表
1)离线数据仓库的计算周期通常为每天一次,所以可以每天保存一份全量的维度数据。这种方式的优点和缺点都很明显。
优点是简单而有效,开发和维护成本低,且方便理解和使用。
缺点是浪费存储空间,尤其是当数据的变化比例比较低时。大量数据没有变化
2)拉链表(要数据变化不频繁时)
拉链表的意义就在于能够更加高效的保存维度信息的历史状态

首日获取的全量数据只要用户的最新状态数据,不存在历史的状态数据,无法判断状态的开始
所有折中的认为首日就是当前状态的开始日期

分区策略
将数据存到结束时间所在分区

当天多次修改怎么办?

dwd层:

建表时进可以让粒度更细

事实表分类:
事务型事实表
绝大多数事实表

特殊需求,用以下方式建表为了提高效率:

周期性快照事实表:(特殊需求不需要关联计算直接如存量指标:存款,直接从业务数据库中周期性获取)因为特殊需求可能需要多个行为关联得到,所有有周期快照事实表

  • 日度快照事实表:每天更新一次(保存2状态数据,存量数据)
  • 问为什么不作为维度表?因为这是度量值

累计型快照事实表:(将一个流程的多个行为的状态累计在一个表中)

事实表应该包含以下信息:

  • 包含维度信息:维度越多描述行为越详细
  • 包含度量值:所有行为必须可以用来统计,用来统计的值就是度量值

设计事务事实表时一般可遵循以下四个步骤:
选择业务过程→声明粒度→确认维度→确认事实

dim表的数据来源:从业务数据库中确定主维表和相关维表,在从ods中找到该表

dwd表的数据来源:mysql不可以得到行为数据,只能得到状态数据,所以从maxwell中获取update,insert,delete操作的数据,就是行为数据(找到会应为行为变化的表)

首日获取的数据无法判断行为,所有,认为当前数据都是新增

建表-》load数据-》save数据

为什么dim大多是全量表dwd大多是增量表?
因为dim是状态数据,dwd是行为数据,状态数据需要全量,行为数据需要增量。

ADS
ads的数据是最终统计结果,所有不需要列存储,也不需要压缩snappy。
因为要同步到mysql,所有用行存储同步更快,文件格式tsv,压缩gzip。

因为要给客户看所有数据不会很多
所有ADS没有分区
ADS是客户要什么就建什么表

  • 统计周期:统计的时间范围
  • 统计粒度:分析数据的角度(用那个维度分析)
  • 指标:客户想要的结果数值
    数据装载
    -指标分析:
  • 原子指标:业务过程(行为) + 度量值(要聚合的值) + 聚合逻辑(聚合函数)
  • 派生指标:原子指标 + 统计周期(分区字段过滤,过滤的是文件夹) + 统计粒度(从哪个维度分析) + 业务限定(数据字段过滤,过滤的是文件)
  • 衍生指标:通过多个派生指标计算得到的指标,如:比率、增长率、占比等

dws层:
依赖于ads层
简化计算提前聚合,如果表可以在多个地方使用,可以提高效率
数据量大,要分区

1d数据来源:DIM,DWD
nd数据来源:必须为1d表
td数据来源:可以为1d表也可以为DIM表DWD表

表的设计:
参考ADS设计指标分析

  • 原子指标:行为 + 度量值 + 聚合逻辑
  • 派生指标:原子指标 + 统计周期 + 统计粒度 + 业务限定
  • 衍生指标:通过多个派生指标计算得到的指标,如:比率、增长率、占比等

如果

  • 业务过程相同:数据来源相同
  • 统计周期相同:数据分区相同
  • 统计粒度相同:维度相同
    这样的多个指标可以放在同一张表中,减少表的数量,提高查询效率。
[up主专用,视频内嵌代码贴在这]