一、引言
最近跟朋友一起聊起来数仓建模规范,结合最近公司使用,以及个人感触,写一篇文章供大家探讨交流,后面一篇文章我会写下数仓的对应的详细生命周期。
二、模型分层规范
1. 目的
- 规范化数仓分层逻辑,避免数据位置混乱,确保数据在不同层次之间的清晰定位和有序流动。
- 实现高内聚松耦合,便于数据的管理和维护。不同层次的数据具有不同的职责和特点,相互独立又相互协作,提高了数据仓库的可扩展性和灵活性。
2. 规范
- 数据层次划分为四层:业务层(ODS)、通用模型层(DWD/DWS)、应用层(ADS)。
- 业务 ODS 层:
- 定义:来自外部系统的数据同步引入到大数据平台,没有经过加工处理的原始数据,其数据结构与源业务系统的数据 schema 保持一致,被称为 “贴源层”。
- 来源:业务系统、网站 / APP 的流量采集系统的采集日志数据或外部采集的数据,直接在大数据平台存储的物理模型构成 ODS 层物理表。
- 数据中间层(DWD + DWS):
- 公共维度层:基于维度建模概念思想,建立整个数据中台部的一致性维度,为后续的数据处理和分析提供统一的维度标准。
- 明细粒度事实层:以业务过程作为建模驱动,构建最细粒度的明细层事实表。结合数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理,提高数据查询性能。
- 公共汇总粒度事实层:以分析的主体作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。
- 应用层 ADS:
- 定义:面向特定产品需求或应用结构构建的特定格式数据组织,以功能需求驱动,模型结构以应用便捷为组织原则。
3. 术语解释
- ODS:Operation Data Store,业务操作层数据,存储原始业务数据。
- DIM:Dimension,维度表层,用于存储维度数据。
- TMP:临时表层,临时查询使用过渡表。
- CDM:Common Data Model,通用数据模型(数据中间层),包含 DWD 和 DWS。
- DWD:Data Warehourse Detail,数据仓库明细层数据。
- DWS:Data Warehourse Summary,数据仓库汇总层数据。
- DM:Data Market,数据集市层。
- ADS:Application Data Store,面向应用层数据。
三、模型设计规范
1. 设计约定
- 统计表允许多个维度:便于从不同角度对数据进行分析和统计,满足多样化的业务需求。
- 模型复用层:先设计公用模型,各业务优先使用公用模型指标。个性化指标可分别设计模型,提高模型的复用性,减少重复开发。
- 命名规范化:DWD/DWS 层命名只控制头(业务域 + 数据域)、尾(刷新周期及数据粒度),使命名更加规范、易于理解和管理。
2. 层次调用约定
- 应用层优选调用 DW 公共层和集市层数据,不允许应用层跨过中间层和集市层从 ODS 层重复加工数据。避免过度的 ODS 层引用和不合理的数据复制、子集合冗余,提高数据处理效率和数据一致性。
- 中间层应积极将公用的数据沉淀到公共层,为其他项目提供数据服务,实现数据的共享和复用。
3. 表命名规范
- 每日全量分区:datax_ods_<上游逻辑表名>,例如 datax_ods_cp_act_re_procdef_df。
- 每日增量分区:datax_ods <上游逻辑表名> delta,例如 datax_ods_cp_act_re_procdef_delta。
- 中间层 DWD 表命名规范:dwd <业务域>< 数据域 >< 业务过程 | 自定义表名 >< 存储策略 >。
- 中间层 DWS 表命名规范:dws <业务域>< 数据域 >< 业务过程 >< 粒度 | 自定义表名 >_< 时间维度 >。
- 中间层 DIM 维表命名规范:dim <业务域>< 数据域 >_< 自定义表名 >。
- 应用层 ADS 表命名规范:ads <数据应用名称>< 自定义表名 >_< 时间维度 >。
- 视图命名规范:view <自定义表名> for_<BU / 部门 / 系统 >。
4. 存储策略
- 策略类型:包括实时全量、实时增量、15 分钟全量、15 分钟增量等多种类型,以满足不同数据更新频率和存储需求。
- 后缀缩写:不同的存储策略对应不同的后缀缩写,例如实时全量为_rf,实时增量为_ri 等,便于识别和管理。
5. 时间维度
- 定义了多种时间维度,包括最近 1 次、最近 1 天、最近 1 周、自然月、自然年等,满足不同时间范围的数据分析需求。
- 时间维度命名规范,例如最近 1 天为 1day(_1d),自然月为 calendar month(_cm)等,使时间维度的表达更加清晰和统一。
6. 字段级命名规范
- 统计日期:用于标识表中数据的计算日期,字段命名格式为 stata_date,在 DWS 层及以上的表中必须存在。
- 编码字段:为标识主题唯一性而设置的编码,字段命名格式为 <标识主体>_code。
- id 字段:纯数字的序列号,没有特殊含义,字段命名格式为 <标识主体>_id。
- 计数字段:单量、计数、用户数等整数值型信息字段,计数主体指计数运算的对象,字段命名格式为 <计数主体>_cnt。
- 比例字段:占比、百分率等 double 值型信息字段,字段命名格式为 <计数主体>_rate。
- 费用字段:各类费用、收入相关字段,命名格式为 <标识主体>_amt。
- 标识字段:取值为 '0/1' 的二元值字段,字段命名格式为 is_<标识主体>。
- 时间字段:数据类型为 String,格式为 YYYY-MM-DD HH-MI-SS 带有小时分钟秒等精度的字段,字段命名格式为 <业务主体>_time。
- 日期字段:数据类型 String,格式为 YYYYMMDD 的精确到天的时间字段,字段命名格式为 <业务主体>_date。
- 分区字段:分区字段的含义需要在分区表中情况进行说明,分区深度不建议超过 3 层,包括日 / 报表周 / 周分区、月 / 季度 / 年分区、小时分区、分钟分区、业务分区等。
7. 指标命名规范
- 指标字段命名格式为:<原子指标>< 维度组合 >< 计算规则 >_< 时间维度 >。
- 例如,原子指标为开标数(bid),维度为数据来源(source),状态(status),预警级别(level,缩写为 lvl),计算规则为求和(cnt)、占比(rate)、明细(detl)等,时间维度参照前面的规范。
四、数据类型
1. ODS 层数据类型转换规则
- ODS 层的数据类型基于源系统数据类型转换,例如 Mysql 数据类型 TINYINT/SMALLINT/MEDIUMINT/INTEGER/BIGINT 转换为数仓数据类型(hive)的 Bigint。
- FLOAT/DOUBLE/DECIMAL 转换为 Double,有精度要求可用 decimal。
- LONGTEXT/TEXT/VARCHAR/CHAR 转换为 String。
- DATE 转换为 String(格式:YYYYMMDD)。
- DATETIME 转换为 String(格式:YYYY-MM-DD HI24:MM:SS.sss)。
- Oracle 数据类型 Number 根据实际数据,如果是浮点数则使用 double,默认使用 bigint。VARCHAR2/VARCHAR 转换为 String (格式:YYYYMMDD),DATE 转换为 String(格式:YYYY-MM-DD HI24:MM:SS),CLOB 转换为 String。
- 日志解析前数据类型 STRING 大字段转换为日志解析后数据类型 String 所有字段。
2. CDM 层和 ADS 层数据类型标准
- Bigint:数字型关联字段,例如标段 ID 等,没有小数位的统计值。
- Double:有小数位的统计值,有精度要求可用 decimal。
- String:除上述情况。
五、其他命名规范
1. 脚本内部临时表命名规范
- 周期性任务建议采用分区表,现表名后加周期,例如 tmp <目标表>[n]。
六、接口开发规范
- 接口相关字段、输入、输出参数采用驼峰式命名。
- 接口路径不超过 4 层,长度不宜超过 30 个字符。
- 建议以 /ads/ 模块 / 子模块 / 子子模块的方式命名。
- 数仓分层按照 / 数仓分层 / 业务域 / 数据域 / 指标名称的方式命名。
七、总结
数据仓库建模规范是确保数据仓库高效、可靠运行的重要保障。通过规范模型分层、设计、数据类型、命名以及接口开发等方面,可以提高数据仓库的可维护性、可扩展性和数据质量,为企业的决策支持提供准确、及时的数据服务。在实际应用中,应根据企业的业务需求和数据特点,灵活运用这些规范,不断优化和完善数据仓库的建设。