本文为您介绍建设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时的转换规则如下。
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_{业务}:表示布尔型数据字段。以YN表示,不允许出现空值域。
  • 原则上不需要冗余分区字段。

数据冗余

一个表做宽表冗余维度属性时,应该遵循以下建议准则:
  • 冗余字段与表中其它字段高频率(大于3个下游应用SQL)同时访问。
  • 冗余字段的引入不应造成其本身的刷新完成时间产生过多后延。
  • 公共层数据不允许字段重复率大于60%的相同粒度数据表冗余,可以选择在原表基础上拓宽或者在下游应用中通过JOIN方式实现。

数据拆分

数据的水平和垂直拆分是按照访问热度分布和数据表非空数据值、零数据值在行列二维空间上分布情况进行划分的。
  • 在物理上划分核心模型和扩展模型,将其字段进行垂直划分。
  • 将访问相关度较高的列在一个表存储,将访问相关度较低的字段分开存储。
  • 将经常用到的Where条件按记录行进行水平切分或者冗余。水平切分可以考虑二级分区手段,以避免多余的数据复制与冗余。
  • 将出现大量空值和零值的统计汇总表,依据其空值和零值分布状况可以做适当的水平和垂直切分,以减少存储和下游的扫描数据量。

空值处理原则

  • 汇总类指标的空值:空值处理,填充为零,当前MaxCompute基于列存储的压缩技术不会由于填充大量空值导致存储成本上升。
  • 维度属性值为空:在汇总到对应维度上时,对于无法对应的统计事实,记录行会填充为-99(未知),对应维表会出现一条-99(未知)的记录。