本文为您介绍数仓建设的公共规范。
层次调用约定
应用层应优先调用公共层数据,必须存在中间层数据,不允许应用层跨过中间层从ODS层重复加工数据。一方面,中间层团队应该积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他团队提供数据服务;另一方面,应用层团队也应积极配合中间层团队进行持续的数据公共建设的改造。必须避免出现过度的引用ODS层、不合理的数据复制以及子集合冗余。
ODS层数据不能被应用层任务引用,中间层不能有沉淀的ODS层数据,必须通过CDM层的视图访问。
CDM层视图必须使用调度程序进行封装,保持视图的可维护性与可管理性。
CDM层任务的深度不宜过大(建议不超过10层)。
原则上一个计算刷新任务只允许一个输出表。
如果多个任务刷新输出一个表(不同任务插入不同的分区),DataWorks上需要建立一个依赖多个刷新任务的虚拟任务,通常下游应该依赖此虚拟任务。
CDM汇总层应优先调用CDM明细层。
在调用可累加类指标计算时,CDM汇总层尽量优先调用已经产出的粗粒度汇总层,以避免大量汇总直接从海量的明细数据层计算。
CDM明细层累计快照事实表优先调用CDM事务型事实表,以保持数据的一致性产出。
避免应用层过度引用和依赖CDM层明细数据,需要针对性地建设好CDM公共汇总层。
项目分配
按实际需求分配不同的ODS和CDM项目。一个ODS层项目对应一个CDM项目。例如:
ODS层项目,按业务部门的粒度建立。
CDM层项目,按业务部门的粒度建立。
ADS层项目,按应用的粒度建立。
一个项目的划分结构如下图所示。
项目命名规范
ODS层项目名称以ods为后缀,例如tbods。
中间层项目名称以cdm为后缀,例如tbcdm。
应用层项目中,数据报表、数据分析等应用名称以bi为后缀,例如tbbi;
而数据产品等应用名称以app为后缀,例如sycmapp。
数据类型规范
ODS层的数据类型应基于源系统数据类型转换。例如,源数据为MySQL时的转换规则如下。
MySQL数据类型 | MaxCompute数据类型 |
---|---|
TINYINT | TINYINT |
SMALLINT/MEDIUMINT | SMALLINT |
INTEGER | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DECIMAL | DECIMAL |
CHAR/VARCHAR | VARCHAR |
LONGTEXT/TEXT | STRING |
DATE/TIMESTAMP/TIME/YEAR | STRING |
DATETIME | DATETIME |
CDM数据公共层如果是引用ODS层数据,则默认使用ODS层字段的数据类型。其衍生加工数据字段按以下标准执行:
金额类及其它小数点数据使用DOUBLE类型。
字符类数据使用STRING类型。
ID类和整形数值使用BIGINT类型。
时间类型数据使用STRING类型(如果有特殊的格式要求,可以选择性使用DATETIME类型)。
状态使用STRING类型。
公共字段定义规范
数据统计日期的分区字段按以下标准:
按天分区:
ds(YYYYMMDD)。
按小时分区:
hh(00-23)。
按分钟:
mi (00-59)。
is_{业务}:
表示布尔型数据字段。
以Y和N表示,不允许出现空值域。
原则上不需要冗余分区字段。
数据冗余
一个表做宽表冗余维度属性时,应该遵循以下建议准则:
冗余字段与表中其它字段高频率(大于3个下游应用SQL)同时访问。
冗余字段的引入不应造成其本身的刷新完成时间产生过多后延。
公共层数据不允许字段重复率大于60%的相同粒度数据表冗余,可以选择在原表基础上拓宽或者在下游应用中通过JOIN方式实现。
数据拆分
数据的水平和垂直拆分是按照访问热度分布和数据表非空数据值、零数据值在行列二维空间上分布情况进行划分的。
在物理上划分核心模型和扩展模型,将其字段进行垂直划分。
将访问相关度较高的列在一个表存储,将访问相关度较低的字段分开存储。
将经常用到的Where条件按记录行进行水平切分或者冗余。
水平切分可以考虑二级分区手段,以避免多余的数据复制与冗余。
将出现大量空值和零值的统计汇总表,依据其空值和零值分布状况可以做适当的水平和垂直切分,以减少存储和下游的扫描数据量。
空值处理原则
汇总类指标的空值:
空值处理,填充为零,当前MaxCompute基于列存储的压缩技术不会由于填充大量空值导致存储成本上升。
维度属性值为空:
在汇总到对应维度上时,对于无法对应的统计事实,记录行会填充为-99(未知),对应维表会出现一条-99(未知)的记录。
前文回顾