目前在做的数据产品都是基于数据仓库上实现,主要的应用方式包括固定报表、数据查询、数据挖掘等。
在知识类相关的数据分析产品中,通常需要对多个业务系统的数据进行集成,更需要对数据分层进行科学的规划。
为什么分层
我们对数据进行分层的一个主要原因就是希望在管理数据的时候,能对数据有一个更加清晰的掌控,详细来讲,主要有下面几个原因:
- 清晰数据结构:每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解;
- 数据血缘追踪:简单来讲可以这样理解,我们最终给业务诚信的是一能直接使用的张业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围;
- 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算;
- 把复杂问题简单化:讲一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复;
- 屏蔽原始数据的异常;
- 屏蔽业务的影响:不必改一次业务就需要重新接入数据。
数据体系中的各个表的依赖就像是电线的流向一样,我们都希望它是很规整,便于管理的。
怎么分层
大部分数据处理都是基于百度的分层思想来做,可以把数据仓库分为下面三个层,即:数据运营层、数据仓库层和数据产品层,但通常在数据仓库实践中,这种简单的分层模式会导致数据仓库层承担过多的功能,比如明细数据和汇总数据分层不明确等。优化后的数据分层如下:
- 数据接口层 Reduced -- 通常在UDA系统中进行灵活配置,不需要任何coding即可将数据入库,并可以做简单的处理。
- 近源数据层 ODS
- 明细数据仓库层 DWD
- 轻度汇总数据仓库层 DWG
- 数据应用层 (根据具体的应用形式命名,比如报表 CPT,关键指标 KPI)
- 中间数据层 TMP
Reduced 层
INF, 即接口数据层,主要来源主要为数据库和文件。数据结构和数据源基本相同,为了方便后续历史数据处理,需添加以下字段:
- dw_created_time
该记录生成的时间。
- dw_updated_time
该记录更新的时间,默认与 dw_created_time ,数据发生更新时更新。
- dw_deleted_time
dw 中该记录删除的时间,默认值为 9999-12-31。
- src_updated_time
源数据中的更新时间戳。
我们对接口层的定义是把源系统的数据拉取到数据仓库中,而这个步骤可能由非技术人员来完成,所以尽可能简单,不对数据进行过多修改。
接口层中所有表以 INF_ 为前缀,其中字典表以 INF_DICT_为前缀。
ODS 层
近源数据层主要完成以下工作:
- 根据数据的量级选择分区键对数据进行分区
- 对缓慢变化维进行处理,反应变化
近源数据层不做以下事情:
- 脏数据处理;
- 数据表间一致性处理;
- 不同业务表的合并.
我们对于近源数据层的定位是可以"快速"的构建基础数据平台. 不做业务相关的处理可以让这部分的工作专注在大数据架构正确性和稳定性的问题.
DWD 层
数据仓库明细层,由 ODS 层经过去重、去噪、字典翻译、空值转化,日期格式化、关联JOIN、维度分析等清洗后的数据,主要包括两种形式,数据宽表和维度模型(星型模型)。
它的定位是"操作简单, 执行快速, 屏蔽错误, 统一口径".
这个过程主要完成如下几个事情:
- 合并不同业务为统一过程;
- 屏蔽脏数据, 比如典型的测试数据.
- 冗余字段. 把常用的join操作在宽表中封装.
数据宽表以DW_为前缀;事实表以DW_FACT_为前缀;维度表以DW_DIM_为前缀。
通常优先考虑使用数据宽表实现,在灵活性要求比较高或有特殊要求的情况下采用维度模型实现。
DWG 层
数据仓库轻度汇总层,对明细层的数据根据年、月、日等维度对数据进行轻度汇总。
轻度汇总层的表名以 DWG_ 为前缀。
应用层
应用指标层 KPI
应用指标层,针对常用的 KPI 指标项进行计算。
应用报表层 CPT
专用于报表应用,一般适用于计算比较复杂的报表应用(如跨数据集计算等)。