数仓ETL规范
1. 表命名规范
- ODS层命名为ods_表名
- DWD层命名为dwd_dim/fact_表名
- DWS层命名为dws_表名
- DWT层命名为dwt_表名
- DIM层命名为dim_表名
- ADS层命名为ads_表名
- 临时表命名为tmp_xxx
- 用户行为表,以log为后缀
2. 脚本命名规范
- 脚本名字小写,单词用下划线间隔
- 数据层名_目标表名_用途_源表名.sh
3. 脚本内容规范
脚本分为三部分:
1.开头注释区:包含任务名、源表、目标表、调度方式、调度频率、描述以及算法 、作者、创建日期
2.自定义变量申明区
3.sql内容,建议不超过一千行
4. sql规范
4.1 sql注释
- sql比较复杂的应带有详细的注释
- sql注释可以以"—"开头(脚本中还支持#开头),但不支持/内容/
- 语句注释:如果某句sql很复杂,注释需要说明里面的实现逻辑和特殊处理,方便其他同学了解和排查
- 字段注释:需要—后面跟字段中文名,表后面跟中文表名 缩进和换行 变量名和关键字使用大写,
4.2 sql格式
- sql书写递进式,外面使用4个空格,内层使用8个空格,不能使用tab键代替
- 遇到关键字select from where update insert on HAVING、LATERAL VIEW 需要换行
- 字段每一行用逗号开头
- sql结尾换一行用分号结尾
- as 后面跟上字段不能换行
- 每一行建议最多有120个字符
- 层次不同的sql里面,涉及子查询要用4个空格缩进
- 使用+-*/%>=等符号两边要有空格
5. 别名规范
- 外层别名用T1T2,内层别名用S1,内三层用P1 别名必须用AS
- select后面所有要查出的字段都要含有表的别名
5. 关联规范
- 大表关联不超过3个 小表关联不超过10个
- 一般认为不超过10万数据为小表
- 一般使用左外关联
- 不建议使用自然连接而是inner join
- 不建议使用full join
- 如果关联条件是为唯一值可以不用关联,比如 a.date=‘20240101’ and b.date=‘20240101’
- 左表选择过滤数据多的去关联
- 关联表出现null值,目标表字段不能为空,需要处理空值
- 关联的字段是唯一值不能为null
- a join b 的关联字段中b的字段最好是主键
- 关联的表中使用别名就所有地方都使用别名,避免出现表名和别名都在用的情况,容易出现笛卡尔集
6. null值规范
初始表数据和数据处理, 字段如果为 数值:默认为0 字符串:默认为‘’
日期类型:默认为20991231或者0001–01-01 时间戳:0001-01-01 00:00:00 如果新建字段,默认值可以跟着业务走,默认按照上述默认值规则 如果是join没有关联上的字段为null,可按照码值设置未知值,否则按照上诉默认值规则
7. 临时表规范
按照删除创建再删除流程处理,保证在数据仓库中不存在临时表 以vt_ 时间yyyymmdd或者编号) 数据存放在tmpdb库中
8. 备份表规范
备份表名长度不超过32位,按照表名_bak_yyyymmdd,方便后期磁盘空间不足清理部分表 为了hdfs最大使用率空间采用orc压缩格式
9. 字段类型规范
- 数量类型用bigint
- 金额类型为decimal(12,2)
- 字符串(名字, 描述信息等)类型为string
- 主键外键类型为string
- 时间戳类型为bigint
- 为了提高数据仓库性能,不建议使用隐式转换
- 不建议数值类型和字符串类型插入日期类型的表中
- 字符串入库前要trim,字符串连接或者运算时候要trim,关联的时候要trim
- where和on后面 的字段类型要匹配,不能出现字段做转换,可以用具体值转换,比如str_to_date(a.datestr)=‘20240101’
10. 表类型规范
大部分都用orc非事务型存储 备份表也是orc非事务存储