数据分层
数据运营层:ODS(Operational Data Store)
ODS层,最接近源数据层,为了考虑后续数据追溯,这一层不建议做过多的数据清洗工作,最好原封不动的接入原始数据。
数据仓库层:DW(Data Warehouse)
数据仓库层是我们在做数据仓库时要核心设计的一层,在这里,要从ODS层提取数据建立各种数据模型,DW层又细分为DWD层,DWM层和DWS层。
- DWD(Data Warehouse Detail)
DWD层要做的是将数据清理、整合、规范化、脏数据、垃圾数据、规范不一致的、状态定义不一致的、命名不规范的数据整合成统一规格(粒度)。
同时为了提高数据的易用性,要采用一些维度退化操作,将一些维度退化到事实内,减少事实表与维度表的关联。
另外,也要做一些数据聚合,将相同数据的表汇聚在一张表,提高数据可用性。
- DWM(Data Warehouse Middle)
DWM会在DWD层的基础上,对数据做轻度的聚合操作,生成一系列中间表,提升公共指标的复用性,减少重复加工。
如果直接从DWD层直接把数据拉取到DWS层的话会因为计算力太大或维度太少造成资源消耗过大。
所以一般的解决方案是先从DWD层计算几个DWM表,然后直接拼接成DWS层,DWM层可以直接用完即删。
- DWS(Data Warehouse Servce)
DWS层为公共汇总层,会进行轻度汇总,粒度比明细数据稍粗,DWS层会整合汇总成分析某一个主题域的服务数据,一般是宽表。DWS层至少覆盖80%的应用场景,又称DM层。
按照业务划分,如主题域–流量、订单、用户等,生成字段比较多的宽表,用于后续查询。
数据应用层:APP(Application)
APP层主要用于提供数据产品和数据分析使用的数据,一般存放在ES、PostgreSQL、Redis等系统中供线上系统使用,也可以使用OLAP引擎供数据分析与数据挖掘使用,报表数据就来源于这里。
维度层DIM(Dimension)
维度层包含两个部分:
高基数维度数据:一般是用户资料表、商品资料表类似的资料表,数据量可以上千万上亿。
低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维度表,数据量大概在几千几万。
表规范
首先判断这个表的用途,是业务数据/日志接入数据、中间表还是业务输出数据,如果是中间表,那么判断该表是否需要分组操作,如果不需要就导入DWD层,需要的话就需要判断表是否是多个行为表的汇总表(宽表)。最后加上事业群、部门、业务线、自定义名称和更新频率等信息即可。
命名规范:
范围 | 符号 |
维度层 | dim |
数据集市层 | dm |
贴源数据层 | ods |
数据明细层 | dwd |
数据汇聚层 | dws |
日快照 | d |
增量 | i |
周 | w |
拉链表 | l |
非分区全量表 | a |
常规表
常规表是我们需要固化的表, 是正式使用的表,也就是需要投入精力去维护的表。
命名规范:分层前缀[dwd|dws|ods]_部门_业务域_主题域_XXX_更新周期|数据范围
业务域与主题域可以用词根的方式枚举清除,不断完善。
更新周期主要是时间粒度、日、月、年、周等。
中间表
中间表一般存在于作业中,中间表的作用域只在当前Job执行过程中,Job一旦执行完毕,该表可以释放(一般情况下会保留几天来回溯)。
命名规范:mid_table_name_[0~9|dim]
以mid开头,接表名,最后以特定的词语或数字编号结尾,如果遇到需要补全维度的表,就以dim结尾。如果需要保留历史记录,name就要加上时间戳。
临时表
临时表就是临时测试或查看数据用的表,可以随时删除。
命名规范:tmp_xxx
以tmp开头即可。
维度表
维度表可以从ods层抽取出来,也可以手工维护。
命名规范:dim_xxx
以dim开头,表名与内容有关即可。
手工表(明细表)
手工表是整个仓库的核心,一般都是一次初始化,然后就不会自由变动了,发生变动也是手动维护。
命名规范:dwd_业务域_manual_xxx
dwd表示明细层,后接业务域,manual表示手工维护表,后接表名
数据处理方式
增量表
增量数据是上次导出后的新数据。
- 记录每次增加的量,而不是总量
- 只汇报变化量,无变化不汇报
- 每天一个分区
全量表
所有的数据。
- 全量表,有无变化都要报。
- 每次上报的数据都是所有的数据
- 只有一个分区
快照表
按日分区,记录截止数据日期的全量数据。
- 快照表,有无变化,都要报
- 每次上报的数据都是所有的数据
- 一天一个分区
拉链表
记录截止日期的全量数据
- 记录一个事物从开始,一直到当前状态的所有变化的信息
- 拉链表每次上报的都是历史记录的最终状态,是记录在当前时刻的历史总 量
- 当前记录存的是当前时间之前的所有历史记录的最后变化量(总量)
- 只有一个分区