具体仓库的分层情况需要结合业务场景、数据场景、系统场景进行综合考虑。
该数据分类架构在ODS层分为三部分:数据准备区、离线数据和准实时数据区。在进入到CDM层后,由以下几部分组成:
请根据业务划分数据并约定命名,建议针对业务名称结合数据层次约定相关命名的英文缩写,这样可以给后续数据开发过程中,对项目空间、表、字段等命名做为重要参照。
模型是对现实事物的反映和抽象,能帮助我们更好地了解客观世界。数据模型定义了数据之间关系和结构,使得我们可以有规律地获取想要的数据。例如,在一个超市里,商品的布局都有特定的规范,商品摆放的位置是按照消费者的购买习惯以及人流走向进行摆放的。
数据模型的作用
数据模型是在业务需求分析之后,数据仓库工作开始时的第一步。良好的数据模型可以帮助我们更好地存储数据,更有效率地获取数据,保证数据间的一致性。
模型设计的基本原则
高内聚和低耦合
一个逻辑和物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论中的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关的数据、粒度相同数据设计为一个逻辑或者物理模型;将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。
核心模型与扩展模型分离
建立核心模型与扩展模型体系,核心模型包括的字段支持常用核心的业务,扩展模型包括的字段支持个性化或是少量应用的需要。在必须让核心模型与扩展模型做关联时,不能让扩展字段过度侵入核心模型,以免破坏了核心模型的架构简洁性与可维护性。
公共处理逻辑下沉及单一
底层公用的处理逻辑应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用层实现,不要让公共逻辑在多处同时存在。
成本与性能平衡
适当的数据冗余可换取查询和刷新性能,不宜过度冗余与数据复制。
数据可回滚
处理逻辑不变,在不同时间多次运行数据的结果需确定不变。
一致性
相同的字段在不同表中的字段名必须相同。
命名清晰可理解
表命名规范需清晰、一致,表命名需易于下游的理解和使用。
说明
应用层应优先调用公共层数据,必须存在中间层CDM数据,不允许应用层跨过中间层CDM从ODS层重复加工数据。
中间层CDM需要积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他层提供数据服务。应用层需要积极配合中间层CDM持续改造公共层。必须避免出现过度的引用ODS层、不合理的数据复制以及子集合冗余。
按实际需求分配不同的ODS和CDM项目。一个ODS层项目对应一个CDM项目。例如:
ods
为后缀,例如xx_ods
。cdm
为后缀,例如xx_cdm
。bi
为后缀,例如xx_bi
;而数据产品等应用名称以app
为后缀,例如sycm_app
。ODS层的数据类型应基于源系统数据类型转换。例如,源数据为MySQL时的转换规则如下。
MySQL数据类型 | Hive数据类型 |
---|---|
TINYINT | INT |
SMALLINT/MEDIUMINT | INT |
INTEGER | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DECIMAL | DECIMAL |
CHAR/VARCHAR | STRING |
LONGTEXT/TEXT | STRING |
DATE/TIMESTAMP/TIME/YEAR | STRING |
DATETIME | DATETIME |
CDM数据公共层如果是引用ODS层数据,则默认使用ODS层字段的数据类型。其衍生加工数据字段按以下标准执行:
一个表做宽表冗余维度属性时,应该遵循以下建议准则:
数据的水平和垂直拆分是按照访问热度分布和数据表非空数据值、零数据值在行列二维空间上分布情况进行划分的。
表命名规范
表命名规则:{层次}{源系统表名}{保留位/delta与否}。
字段命名规范
同步任务命名规范
任务名:
{源系统表名}[delta]。
说明
同一Project下异库同名表的任务名为**{源系统表名}{tddl的appname}[_delta]**。
任务的输出名称,即输出表的名称,需要与数据存储及生命周期管理规范保持一致。
数据表类型 | 存储方式 | 最长存储保留策略 |
---|---|---|
ODS流水型全量表 | 按天分区 | 不可再生情况下,永久保存。日志(数据量非常大,例如一天数据量大于100 GB)数据保留24个月。自主设置是否保留历史月初数据。自主设置是否保留特殊日期数据。 |
ODS镜像型全量表 | 按天分区 | 重要的业务表及需要保留历史的表视情况保存。ODS全量表的默认生命周期为2天,支持通过ds=max_pt(tablename) 方式访问数据。 |
ODS增量表 | 按天分区 | 有对应全量表,最多保留最近14天分区数据。无对应全量表,需要永久保留数据。 |
ODS ETL过程临时表 | 按天分区 | 最多保留最近7天分区。 |
DBSync非去重数据 | 按天分区 | 由应用通过中间层保留历史数据,默认ODS层不保留历史数据。 |
一致性维度规范
公共层的维度表中相同维度属性在不同物理表中的字段名称、数据类型、数据内容必须保持一致。除了以下情况:
维度的组合与拆分
命名规则:{project_name}.dim{业务/pub}{维度定义}[_{自定义命名标签}],其中的pub与具体业务无关,各个业务部都可以共用,例如时间维度。
CDM公共维度层的表的类型为维度表,存储方式为按天分区。
模型设计者根据自身业务需求设置表的生命周期管理。您可依据3个月内的最大需要访问的跨度设置保留策略,具体计算方式如下:
命名规则:{project_name}.dwd{业务缩写/pub}{数据域缩写}{业务过程缩写}[{自定义表命名标签缩写}]{刷新周期标识}{单分区增量全量标识}。
命名说明:
CDM明细层的表的类型为事实表,存储方式为按天分区。
事务型事实表一般永久保存。周期快照型事实表根据业务需求设置生命周期管理。您可依据3个月内的最大需要访问的跨度设置保留策略,具体计算方式如下:
事务型事实表主要用于分析行为与追踪事件。事务事实表获取业务过程中的事件或者行为细节,然后通过事实与维度之间关联,可以非常方便地统计各种事件相关的度量,例如浏览UV,搜索次数等等。
周期快照型事实表主要用于分析状态型或者存量型事实。快照是指以预定的时间间隔来采样状态度量。
累计快照事实表是基于多个业务过程联合分析从而构建的事实表,如采购单的流转环节等。
累计快照事实表主要用于分析事件之间的时间间隔与周期。例如,用交易的支付与发货之间的间隔,来分析发货速度,或在支付和退款环节分析支付退款率等等。
累计快照事实表同时也可以用于帮助分析一些少量的、且对刷新时间不是非常敏感的指标统计。例如,在当前事务型事实表不支持,且只有少量的统计指标时,需要分析交易的关闭和发货,就可以基于累计快照事实表进行计算。
命名规则:{project_name}.dws{业务缩写/pub}{数据域缩写}{数据粒度缩写}[{自定义表命名标签缩写}]{统计时间周期范围缩写}{刷新周期标识}{单分区增量全量标识}。
命名说明:
在默认情况下,离线计算应该包括最近一天(1d)、最近N天(nd)和历史截至当天(td)三个表。
如果nd表的字段过多,需要拆分时,只允许以一个统计周期单元作为原子拆分,即一个统计周期拆分一个表。例如,最近7天(1w)拆分一个表,不允许拆分出来的一个表存储多个统计周期。
对于{刷新周期标识}和{单分区增量全量标识}在汇总层不做强制要求。单分区增量全量标识:i表示增量,f表示全量。
对于小时表不管是按天刷新还是按小时刷新,都用_hh来表示。
对于分钟表不管是按天刷新还是按小时刷新,都用_mm来表示。
CDM汇总层的表的类型为事实表,存储方式为按天分区。
事务型事实表一般会永久保存。周期快照型事实表根据业务需求设置生命周期管理。您可依据3个月内的最大需要访问的跨度设置保留策略,具体计算方式如下:
接口数据层将不同数据域的汇总数据预关联在一个物理表,开放给应用使用,以减少应用层多次重复JOIN的成本开销,CDM接口数据层更适用于实时计算。
命名规则:{project_name}.dwi{业务 BU 缩写/pub}{数据域/hbd}{数据粒度缩写}[{自定义表命名标签缩写}]_{统计时间周期范围缩写}。统计时间周期范围和数据域说明如下:
关于统计时间周期范围缩写,默认情况下,离线计算包括最近一天(1d)、 最近N天(nd)和历史截至当天(td)三个表。
说明
如果出现nd
的表字段过多,需要拆分时,只允许以一个统计周期单元作为原子拆分,即一个统计周期拆分一个表,例如最近7天(1week)拆分一个表,不允许拆分出一个表存储多个统计周期。
如果一个汇总表出现混合多个数据域时,表名称中需要使用hbd(hybird 缩写)进行标识,这种情况当前只用于准实时情况,离线计算不建议跨数据域存储数据。
视图命名规范如下:
因为所有表都是以分区表形式存在的,因此中间表不设置命名规范,全部以正式表方式处理。
不同场景下临时表命名规范不同:
一般生产任务下线后,不急于立马下线表,一般继续存放3个月,修改表名做标注,3个月后再下线表。下线表统一后缀 _retireyyyymmdd,生产任务下线后的表重命名为YYYYMMDD。三个月后需要与表拥有者确认是否能删除。
视图设计规范
视图的命名规范与表保持一致。
建议创建独立的刷新任务以产生视图,创建视图的脚本如下。
create or replace view ***;
工作流节点类型和命名
工作流节点的输出表命名规范
projectname.tablename
工作流节点命名规范
节点类型 | 命名规范 | 备注 |
---|---|---|
虚拟节点 | vt_{虚拟节点含义} | 任务根节点。 |
同步节点导入任务 | imp{表名}[{源库标示}] | 如果多个源库存在表名重复的情况,可以增加源库标识的后缀。 |
同步节点导出任务 | exp{表名}[{目标库标示}] | 如果存在多个目标库,可以增加目标库标识的后缀。 |
数据处理节点 | {输出表名} | 多个目标表输出任务时,选定一个主要表名作为节点名。多个任务插入同一张表的不同分区时,可以建一个虚拟目标表任务。 |
Shell节点 | sh_{脚本命名} | 不涉及 |
MapReduce节点 | mr_{脚本命名} | 不涉及 |
资源文件命名规范
资源名称需有后缀表示资源类型,例如**.JAVA**、.PY、.SH等。
任务设计规范
SQL任务:
{bdp.system.cyctime}
的调度参数,以方便调试。编写原则
基本要求
SELECT *
操作,所有操作必须明确指定列名。数据类型
编码规范
进行数据开发时,在数据开发工作台上进行代码编辑的规范。
代码头部
代码头部添加主题、功能描述、作者、日期等信息。并提供修改日志及标题栏的功能,以便后续修改人员添加修改记录。每一行不能超过80个字符。
针对不同的任务类型提供了不同的代码头部模板,例如,SQL类型任务头部模板默认为如下。
--sql
--********************************************************************--
--author:${author}
--create time:${createTime}
--********************************************************************--
字段排列要求
SELECT子句排列要求
SELECT语句中所用到的FROM、WHERE、GROUP BY、HAVING、ORDER BY、JOIN、UNION等子句,需遵循如下要求:
运算符前后间隔要求
CASE语句的编写
SELECT语句中对字段值进行判断取值的操作将用到CASE语句,正确的编排CASE语句对加强代码行的可读性也是很关键的一部分。对CASE语句编排的约定如下:
子查询嵌套编写规范
在数据仓库系统ETL开发中经常需要用到子查询嵌套,因此代码的分层编排变得非常重要。
表别名定义约定
建议对所有的表加上别名。一旦在SELECT语句中对表定义了别名,在整个语句中对此表的引用都必须以别名替代。考虑到编写代码的便捷性,约定别名尽量简洁,同时避免使用关键字。 表别名定义约定如下:
SQL注释