开发规范
一、数据模型
o1、横向分层
1.1 分层意义
1.2 分层模型
1.2.1 数据同步层
1.2.2 数据清洗层
1.2.3 事实模型层
1.2.4 维度模型层
1.2.5 指标模型层
1.2.6 数据应用层
1.3 层次调用
o2、纵向划域
二、命名标准
o1、术语约定
o2、脚本命名规范
o3、脚本存放规范
o4、表命名规范
o5、字段命名规范
o6、分区命名规范
三、代码开发
四、ETL参数
五、${…}自定义参数
一、数据模型
1、横向分层
1.1 分层意义
复杂问题简单化。将一个复杂的任务分为多个步骤来解决,每一层只解决特定的问题;
数据结构清晰。每一层都有其特定的作用域和职责,在使用表时能快速方便的定位和理解;
提高数据的复用性。避免烟囱式开发,提高数据运算效率;
统一数据口径。
1.2 分层模型
术语约定:
业务类数据 - 数据记录包含新增、更新
日志类数据 - 数据记录只新增,不更新
1.2.1 数据同步层
层名简写:ods
描述:指结构与源系统基本保持一致的增量或者全量数据,不做进一步的模型抽象及复杂业务逻辑处理。该层不对外提供数据访问权限。
同步原则:
1)数据量100w以下 且 数据增速4000条/天以下:全量同步;
2)数据量100w及以上 或 数据增速4000条/天及以上:增量同步。
备注:数据增速以近3个月的数据情况来测算;如果是新上线的表需要和业务同学进行沟通确认数据增长情况。
生命周期:历史所有
1.2.2 数据清洗层
层名简写:dwd_parse
描述:针对ods层数据进行清洗转化,主要完成业务增量数据合并、脏数据过滤、测试数据标识、json数据解析、敏感字段静态脱敏、字段命名格式统一等操作。
备注:对于ods表中不同粒度数据需在此层进行拆分
生命周期:天表、周表、月表:180天
1.2.3 事实模型层
层名简写:dwd_fact
描述:以业务过程作为建模驱动,基于每个具体的业务过程特点,梳理出业务总线矩阵,构建最细粒度的明细事实表和模型宽表。
生命周期:天表、周表、月表:180天
1.2.4 维度模型层
层名简写:dim
描述:基于维度建模构建全域一致性维度,降低数据计算口径和算法不统一风险,采用宽表设计的原则。
维表默认值:需要根据属性来源判断
1)如果是基础属性,空值需要给默认值:DW_Unknown
2)如果来源是业务流程,空值不适合给默认值
生命周期:天表、周表、月表:180天
1.2.5 指标模型层
层名简写:dws
描述:以分析的主题对象作为建模驱动,基于应用和产品的指标需求,构建公共粒度的轻度或重度汇总指标事实,为应用服务层提供相对稳定的数据模型。
生命周期:天表、周表、月表:180天
1.2.6 数据应用层
层名简写:ads
描述:基于业务需求,跨数据域或主题集成、汇总,用于各产品或各业务线个性化数据加工。
生命周期:天表、周表、月表:180天
1.3 层次调用
禁止逆向调用,比如:dws层不能调用ads层数据。
层次调用顺序:
1)(推荐)ods -> dwd_parse -> dwd_fact -> dws -> ads
2)(推荐)ods -> dwd_parse -> dim
3)(临时方案)ods -> dwd_parse -> ads
ads层优先调用dws层,dws层优先调用dwd_fact层。
2、纵向划域
用户
营销
二、命名标准
1、术语约定
表功能:
ods层:load(数据拉取)
dwd层:parse(数据清洗)、fact(事实模型)、model(算法模型)
dws层:cal(数据计算)、model(算法模型)
ads层:push(数据推送至业务生产)、rpt(数据报表)、tag(标签系统)
装载策略:ic(增量),不写默认全量数据处理
装载周期:min(分钟)、h(小时)、d(天)、w(周)、m(月)、q(季)、y(年),不写默认为天处理
数据系统:mysql、mongodb、odps、sqlserver
是否拉链:his
2、脚本命名规范
数据同步脚本:源数据库系统2目标数据库系统_源数据库名称_db_源表名称_[装载策略][装载周期]。
举例:mysql2odps_pms_import_db_chkinaccount
数据处理脚本:原则上与输出表名一致。如果数据脚本处理涉及一读多写(多路输出),需提取多表公共业务描述作为脚本名称
举例:
3、脚本存放规范
数据回流:指定文件夹[数据库]2odps,具体回流根据各业务库名细分
举例:mysql2odps
数据推送:指定文件夹odps2[数据库] ,具体推送根据各业务库名细分
举例:odps2mysql
存放位置:
数据开发脚本存放:根据第一章数仓分层规范建立对应分层文件夹
存放位置:
数据表存放位置:根据分层开发脚本建设对应分层文件夹
存放位置:
4、表命名规范
ods层表:ods_表功能(load)源数据库名称_源表名[装载策略][装载周期][是否拉链]
dwd_parse层表:dwd_parse_数据域_业务过程[装载策略][装载周期][是否拉链]
dwd_fact层表:dwd_fact_数据域_业务过程_[装载策略][装载周期][是否拉链]
dim层表:dim_数据域_数据粒度_[相关描述][装载策略][装载周期][是否拉链]
dws层表:dws_表功能_数据域[数据粒度]一级业务主题[二级业务主题][装载策略][装载周期][是否拉链]
ads层表:ads_表功能_数据域_业务应用描述[装载策略][装载周期][是否拉链]
临时表:
视图表:view_业务描述
备注:[]内容可以选择性添加,不写代表默认值
5、字段命名规范
参考《字段规范》
6、分区命名规范
一级分区命名设置
分区名称 分区含义 分区格式
pt 日期分区 yyyyMMdd
pt_h 小时分区 HH
pt_m 月分区 yyyyMM
pt_y 年分区 yyyy
多级分区命名设置
多级分区使用,一级使用pt,第二级根据实际业务场景设置
三、代码开发
所有查询必须指定具体字段名,禁止使用 select 。原因:显式的指定列可以很清楚查询中返回了哪些列,方便后续的代码维护与问题排查。此外,数仓数据在ETL处理时,并非所有的情况都需要查询原表所有字段,而是其中的部分关键字段。如果数据采用列式存储,使用select * 势必会造成大量不必要的网络IO,浪费资源;
所有查询表名必须同时指定库名和表名;
子查询必须指定表别名,命名方式:tn_业务描述,n从最内层子查询开始编号,起始为1;
排序必须指定排序关键字(desc|asc);
创建表时,禁止使用系统关键字作为字段名,字段和表必须添加业务描述;
字段类型使用,目前字段类型是string,datetime,bigint, decimal,时间类型字段统一使用datetime数据类型。对于源端是boolean类型的字段,在数仓dwd_parse层统一转换为bigint类型,用 0 和 1 替代 true 和 false;
为了增强代码的可读性,必要的时候需添加代码逻辑说明,且统一使用如下格式的脚本头部注释,说明该脚本的业务用途(该项可由项目空间管理员在项目内统一配置)。
--odps sql
––
--author:XXX
--create time:2023-01-01 09:00:36
--application:脚本用途描述
--modify log
--modifiedTime modifiedBy desc
--xxxx-xx-xx xxx 修改了xxx
–
––
调度任务必须支持重跑,比如:不能有insert into语句;手动任务必须支持幂等;
ods层级以上的表,均需生成该表数据唯一标识uid(由一个或多个维度字段通过MD5加密后生成),用于通用数据质量规则配置。
明细属性尽量下沉到对应领域的事实表或者维表,聚合指标下层到dws,ads只能是对原有指标的聚合或引用。
为了统一数据口径,parse层表需明确数据范围,不要带入当天数据,T+1处理。
四、ETL参数
参数名称 参数说明 使用样例
bdp.system.bizdate 昨天日期(yyyyMMdd) ${bdp.system.bizdate}
bizdate 昨天日期(yyyyMMdd) ${bizdate}
current_day 当前时间的日期(yyyyMMdd)
[
y
y
y
y
m
m
d
d
]
五、
[yyyymmdd] 五、
[yyyymmdd]五、{…}自定义参数
根据
b
i
z
d
a
t
e
参数自定义时间格式,其中
y
y
y
y
表示
4
位的年份,
y
y
表示
2
位的年份,
m
m
表示月,
d
d
表示天。可以将参数任意组合,比如
bizdate参数自定义时间格式,其中yyyy表示4位的年份,yy表示2位的年份,mm表示月,dd表示天。可以将参数任意组合,比如
bizdate参数自定义时间格式,其中yyyy表示4位的年份,yy表示2位的年份,mm表示月,dd表示天。可以将参数任意组合,比如{yyyy}、
y
y
y
y
m
m
、
{yyyymm}、
yyyymm、{yyyymmdd}、KaTeX parse error: Unexpected character: '' at position 16: {yyyy-mm-dd}等。 ̲bizdate精确到年月日,因此${……}自定义参数也只能表示到年月日级别。
获取+/-周期的方法,如下表所示。
获取+/-周期 方法
后N年 ${yyyy+N}
前N年 ${yyyy-N}
后N月 ${yyyymm+N}
前N月 ${yyyymm-N}
后N周 ${yyyymmdd+7N}
前N周 ${yyyymmdd-7*N}
后N天 ${yyyymmdd+N}
前N天 ${yyyymmdd-N}