本文为您介绍建设MaxCompute数据仓库的公共规范。
层次调用约定
应用层应优先调用公共层数据,必须存在中间层CDM数据,不允许应用层跨过中间层CDM从ODS层重复加工数据。
中间层CDM需要积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他层提供数据服务。应用层需要积极配合中间层CDM持续改造公共层。必须避免出现过度的引用ODS层、不合理的数据复制以及子集合冗余。
ODS层数据不能被应用层任务引用,中间层CDM不能有沉淀的ODS层数据,必须通过CDM层的视图访问。CDM层视图必须使用调度程序进行封装,保持视图的可维护性与可管理性。
CDM层任务的深度不宜过大(建议不超过10层)。
原则上一个计算刷新任务只允许一个输出表。
如果多个任务刷新输出一个表(不同任务插入不同的分区),DataWorks上需要建立一个依赖多个刷新任务的虚拟任务,通常下游应该依赖此虚拟任务。
CDM汇总层应优先调用CDM明细层。在调用可累加类指标计算时,CDM汇总层尽量优先调用已经产出的粗粒度汇总层,以避免大量汇总直接从海量的明细数据层计算。
CDM明细层累计快照事实表优先调用CDM事务型事实表,以保持数据的一致性产出。
避免应用层过度引用和依赖CDM层明细数据,需要针对性地建设好CDM公共汇总层。
MaxCompute项目分配
按实际需求分配不同的ODS和CDM项目。一个ODS层项目对应一个CDM项目。例如:
ODS层项目,按业务部门的粒度建立。
CDM层项目,按业务部门的粒度建立。
ADS层项目,按应用的粒度建立。
一个项目的划分结构如下图所示。
项目命名规范
ODS层项目名称以
ods
为后缀,例如tb_ods
。中间层CDM项目名称以
cdm
为后缀,例如tb_cdm
。应用层项目中,数据报表、数据分析等应用名称以
bi
为后缀,例如tb_bi
;而数据产品等应用名称以app
为后缀,例如sycm_app
。
数据类型规范
ODS层的数据类型应基于源系统数据类型转换。例如,源数据为MySQL时的转换规则如下。
更多MaxCompute与其他数据库的映射关系,请参见与Hive、MySQL、Oracle数据类型映射表。
MySQL数据类型 | MaxCompute数据类型 |
TINYINT | TINYINT |
SMALLINT/MEDIUMINT | SMALLINT |
INT | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DECIMAL | DECIMAL |
CHAR/VARCHAR | VARCHAR |
LONGTEXT/TEXT | STRING |
TIME/YEAR | STRING |
DATE | DATE |
TIMESTAMP | TIMESTAMP |
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(未知)的记录。