01 为什么要有规范?
-
接到了一个需求,不知道该从那张表出数,表A貌似可以,表B好像也行。问了同事甲,他说他每次都是从C表出的。对着三张表探索了好久,发现谁跟谁都对不上,算了吧,我从源头再算一次吧,结果又变出来一张表D。
-
数据库里几千张表,好像我用到的也就那么十几张,其它的都是干啥用的呢,问了一圈没有人知道,删掉吧?更没有人敢动。
-
有个流程报错了,领导让我去看一下,点进去后,屎一样的代码完全看不懂,另外,找了好久死活找不到上游依赖。
-
有位同事要离职,他负责的那部分内容,换了一个人接手,累死累活好多天依然捋不出个所以然,一气之下又走了一个人。
02 规范该怎么落地?
1、规范制定
2、规范讨论
3、规范推行
-
可以通过群聊天,也可以通过正式回邮件的方式,当然为了引起大家的重视,可以专门组会宣讲。 -
分发宣讲后进入执行阶段,所有人必须严格遵守,如有违犯给予警告,严重的给予惩罚,屡劝不改的取消年终调级调薪等。
-
数据模型应该有统一归口,比如数据架构师,架构师定期检查模型是否合理合规。 -
组织数据开发人员,定期 Review 每个人的代码,但不必针对个人更不要上纲上线,目的是通过对比和讨论让大家明白什么样的才是好代码,最终使“写好代码”成为基本素养。没有条件的话就有 Leader 负责定期检查,有问题的私下指出来帮助组员逐渐规范。 -
入职新人,熟读规范后,还应该安排专人指导,是合规性检查的重点关注对象。
4、规范的执行监督
5、规范完善
03 数仓规范有哪些?

04 设计规范
1、数据模型设计
-
说明
-
分层设计是数据架构设计的产出之一,在模型设计环节做为强制规范遵守。
-
分层规范
-
应用层,面向最终应用。
-
主题域划分,依据是最终应用。生命周期也与应用同步。
-
汇总数据层+主题宽表。
-
数据域划分,依据参考下边的纵向分域。
-
对数据源做清洗、转换、补全、编码转换后加载到明细数据层。
-
数据域划分,依据参考下边的纵向分域。
-
贴源层,原始数据不做变化或者仅做最简单的补全后存入。
-
数据域划分,依据是数据源。
-
ODS
-
DWD
-
DWS
-
ADS
-
层次调用规范
-
禁止反向调用
-
ODS 只能被 DWD 调用。
-
DWD 可以被 DWS 和 ADS 调用。
-
DWS 只能被 ADS 调用。
-
数据应用可以调用 DWD、DWS、ADS,但建议优先考虑使用汇总度高的数据。
-
ODS->DWD->DWS>ADS
-
ODS->DWD->ADS
纵向分域
-
定义
-
主题域通常是联系较为紧密的数据主题的集合,方便寻找和使用数据。
-
基本原则
-
高内聚、低耦合。
-
数量不能太多。建议不超过十个。
-
必须保持稳定。既能涵盖当 前所有的业务需求,又能在新业务进入时无影响地被包含进已有的数据域中或扩展新的数据域。
-
需要结合团队和业务的实际情况,比如业务是否稳定、团队成员建模水平等。
-
适度的抽象。太低不好适应变化,太高不易于理解使用。
-
分类
-
面向分析场景,实现较难,对业务理解、抽象能力等要求高。
-
依据业务流程划分,实现相对容易。
-
数据/业务主题域
-
分析主体域
-
划分依据
-
按照业务或业务过程划分:比如一个靠销售广告位置的门户网站主题域可能会有广告域,客户域等,而广告域可能就会有广告的库存,销售分析、内部投放分析等主题。
-
根据需求方划分:比如需求方为财务部,就可以设定对应的财务主题域,而财务主题域里面可能就会有员工工资分析,投资回报比分析等主题。
-
按照功能或应用划分:比如微信中的朋友圈数据域、群聊数据域等,而朋友圈数据域可能就会有用户动态信息主题、广告主题等。
-
按照部门划分:比如可能会有运营域、技术域等,运营域中可能会有工资支出分析、活动宣传效果分析等主题。基本原则
-
高内聚和低耦合
-
核心模型与扩展模型分离
-
公共处理逻辑下沉及单一
-
成本与性能平衡
-
数据可回滚
-
一致性
-
命名清晰、可理解
附加字段 -
维表:创建时间、更新时间
-
事实表:ETL 日期、更新时间
其它要求 -
表、字段的备注信息,必须言简意赅,在描述清楚的前提下尽量简洁。
-
字段类型的约束:比如字符串用 String,数值用 Int,年月日都用 String 比如 yyyyMMdd 等。
2、命名规范
-
采用蛇形命名法,即采用一个下划线分隔词根。 -
优先使用词根中已有关键字(数仓标准配置中的词根管理),- - 定期 Review 新增命名的不合理性。 -
禁止采用非标准的缩写。 -
命名一律采用小写,只能以字母开头。 -
命名不宜过长。专有规范 -
表 -
分层-分域-分词根-分时间周期 -
正式表,所在层级名称+数据域+表描述+时间周期或加载策略,如增量、快照、拉链/小时、日、周、月、季、年 -
中间表,对应正式表+_mid+阿拉伯数字 -
临时表,z+创建者姓名检查+表名 -
视图 -
参照表命名规范+_v -
字段 -
优先从词根中取,多次出现的要增加到词根库 -
任务 -
与目标表名相同 -
指标 -
一个原子指标+多个修饰词(可选)+时间周期 -
原子指标+时间周期(可选) -
原子指标
业务修饰词 + 词根 -
衍生指标 -
派生指标
3、代码设计规范
-
脚本是否有备注、复杂计算逻辑是否有注释释。 -
任务是否支持多次重跑而输出不变,不能有 insert into 语句。 -
分区表是否使用分区键过滤并且有有效裁剪。 -
外连接的过逑条件是否使用正确,例如在左连接的 where 语句存在右表的过滤条件。 -
关联小表,是否使用/*+ map join * /。 -
不允许引用别的计算任务临时表。 -
原则上不允许存在一个任务更新多个目标表。 -
是否存在笛卡尔积。 -
禁止在代码里面使用 drop、create、rename 等 DDL 语句。 -
使用动态分区时,有没有检查分区键值为 NULL 的情况。 -
对于重要的任务 DQC 质量监控规则是否配置,严禁裸奔。 -
代码中有没有进行适当的规避数据倾斜语句。
4、指标体系建设
-
指标层级划分方式 -
一级分类 -
二级分类 -
三级分类 -
一级分类 -
二级分类 -
按分析主题 -
按业务过程 -
指标定义 -
原子指标(某一业务事件行为下的度量,不可再拆分的指标) 例如:订单金额 -
衍生指标(对原子指标进行四则运算) -
派生指标(统计周期+统计粒度+业务限定+原子指标)例如:最近一天+新创建的+订单个数(阿里大数据之路对于派生指标的定义:派生指标=原子指标+时间周期修饰词+其它修饰词。唯一归属于某一个原子指标,继承原子指标的数据域) -
唯一性 -
可扩展 -
易理解 -
所属分类 -
指标类别 -
名称 -
描述 -
口径/算法 -
计量单位 -
适用维度 -
... -
内容 -
原则 -
类别 -
说明:网上对于指标分类说法不统一,大家知道咋回事儿就行了。搜了一下阿里的大数据之路,没有衍生指标的概念。说法一:衍生指标=派生指标。那么用我上边派生指标的定义即可。说法二:衍生指标是对原子指标进行四则运算得到的。那么衍生指标就是原子指标增加减少几个修饰词或者时间周期扩大缩小后得到的。所以感觉衍生指标有点鸡肋搞不好就变成原子/派生指标了。 -
指标管理流程 -
指标新增申请 -
初审:明确指标口径,检查指标库是否包含 -
二审:审核指标定义需要的各项元素是否准确完备 -
入指标库
05 流程规范
-
公共字段=词根组合+其它关键词。 -
公共字段放入词根库不太严谨,但字段命名时候可以直接取用,降低了命名不一致的风险,所以工具化不太完善的公司推荐这样使用。
1、需求提交流程
-
提出需求 -
需求提出人:以文档的形式提出需求(写清楚需求内容、交付物、期望交付日期),发给数仓 Leader。 -
沟通需求 -
数仓 Leader 将需求分配给相关人承接,同时协商好实际交付日期。 -
如果需求提出人的交付日期与数仓 Leader 的交付日期不一致,双方需要进一步协商一致。 -
开发交付 -
需求承接人,需按照协商一致的交付日期,按期交付。
2、模型设计流程
-
数据调研、业务调研、需求调研 -
数据建模 -
确定业务过程->声明粒度->确定维度->确定事实 -
业务建模->逻辑建模->物理建模 -
构建总线矩阵 -
构建指标体系 -
根据已有的分层分域,分治、各个击破。 -
总体思路 -
多种方式结合使用 -
评审 -
除了模型设计,还需要拉上必要的开发、业务、分析师、产品经理、数仓运维等。 -
上线、迭代、完善
3、ETL开发流程
-
需求理解 -
数据探查 -
程序开发 -
流程依赖 -
配置调度
前端开发规范
-
接口规范 -
代码部署规范
4、上线流程
-
申请 -
上线时间 -
上线功能范围 -
对其它模块、上下游依赖的影响 -
上线支持团队清单 -
上线详细操作步骤 -
测试报告 -
回滚方案 -
评审 -
代码 Review -
上下游影响分析 -
上线
06 质量管控规范
-
上线支持团队就绪
-
严格按照上线操作步骤执行
-
失败回滚
1、源端管控
-
源端变动,必须提前通知数仓侧。 -
有条件的话,使用工具监控源端重点内容的变动。
2、数仓管理
-
对已有规范没有贯彻的给予警告、处罚:建模规范、开发规范、上线规范 -
使用工具加强数据质量监控,发现问题及时通知、告警。建立数据质量解决机制,责任到人。 -
定期复盘 -
重要常见问题入告警规则 -
源端数据质量问题,协调源端解决 -
存储模型、ETL开发、上线流程等引起的问题,需要制定合适的解决方案
3、应用管控
-
统一指标定义 -
统一指标口径 -
统一外部数据输出归口
07 安全规范
网络安全
-
内外网隔离,外网环境访问内网需要登录 VPN;
-
核心数据存储、功能模块,只开放给特定的少部分人。
账号安全
-
每个人分配独立的账号,赋予合理的权限,禁止相互借用。 -
数据库、大数据组件开通多个角色账号。比如只读、部分表读写、管理员等。当然还可以按实际需求细分。Hive、ODPS 的话也是可以实现单人单号的。 -
服务器登录。也是单人单号 -
公司内部应用账号。单人单号。
数据安全
-
至少做到表级别的权限控制,实在不行就分库。
-
ODS 层不对外开放,只对 ODS-DWD 层相关部分开发人员可见。
-
特别敏感数据,如用户年龄、号码、身份证好、地址等,应该放到专门的数据库里,数仓主库只存放用户 ID 和其它必须字段。例如年龄应该脱敏成年龄区间或开发特定的 UDF 转化函数。
08 总结
我们分别从设计规范、流程规范、质量管控、数据安全四个方面,详细阐述了数仓规范。应该已经涵盖了数仓规范的方方面面。