ETL规范

1 基本原则

  1. 可观赏性,代码要求结构清晰,整齐,整体层次分明;
  2. 可读性,代码在合适的位置需要添加必要的注释;
  3. 风格统一性,代码上下文要求风格统一,不允许多种风格糅合在一起;
  4. 命名规范性,表和字段的命名严格遵守数据仓库分层规范

2 命名规范

2.1 通用规范

  1. 表名、字段名采用一个下划线分隔词根(示例:clienttype->client_type);
  2. 每部分使用小写英文单词,属于通用字段的必须满足通用字段信息的定义,禁止使用中文拼音;
  3. 表名、字段名需以字母为开头;
  4. 表名、字段名最长不超过64个英文字符;
  5. 字段名禁止使用关键字
  6. 在表名业务含义部分禁止使用非标准的缩写

2.2 数据表命名

【推荐】表名称 = [数仓分层][业务主题][子主题][表含义][存储格式][更新频率][后缀]
在这里插入图片描述
思考:视图使用场景,什么层的使用视图?

2.3 表字段命名

  1. 【强制】相同业务含义的字段(维度、事实字段、指标度量)在不同的主题,不同事实表,不同的维度表中必须使用同一个字段名称(例如:地址维度不允许既命名为address,又命名为location);
  2. 【推荐】字段命名优先参考数仓标准配置中的词根管理,词根参考
    https://wiki.n.miui.com/pages/viewpage.action?pageId=402282034

3 建表规范

  1. 表的数据类型不允许全用string,不便于暴露问题和排查问题,合理使用bigint,decimal等数据类型;
  2. 所有分层的表必须有表级别的注释,建议DW层表有字段级别的注释;
  3. 所有建表语句需保存为sql或者hql格式文件,并保存到git;
  4. 【建议】hive表存储格式,除了文件导入用textfile;其他数据表统一使用parquet格式
  5. kudu表必须指定主键,且有分区字段
  6. hive表分区字段
  7. 按天,月分区,分别是date,month,且格式为20200727, 202007, bigint类型
  8. 按其他业务分区,string类型
  9. 尽量不出现3级或3级以上分区
  10. hive分区表增加字段或者修改字段类型时,末尾添加cascade关键字,这样能同时更新表和分区的元数据信息【hive里执行】

4 编码规范

  1. 【推荐】使用with语句,代替嵌套子查询;

  2. 【强制】禁止使用SELECT *;

  3. 【推荐】SQL关键字统一大写或者小写,禁止大小写混用,前后不一致使用;

  4. 【推荐】使用缩进,使代码结构化,缩进默认使用4个空格;可以将tab键设置为4个空格。
    在这里插入图片描述

  5. 规范合理使用换行。

    1. 【推荐】SELECT、FROM、WHERE、GROUP BY、HAVING、LATERAL VIEW、JOIN关键字必须换行;
      在这里插入图片描述

    2. 【推荐】SELECT多个字段时,字段之间必须换行,且逗号统一放置在字段首端或者末端;推荐放在字段前面,便于排查未加逗号或多加逗号的报错;
      在这里插入图片描述

    3. 【推荐】WITH结构 AS关键字后必须换行
      在这里插入图片描述

    4. 【推荐】WITH语句2个代码块间建议添加空行

  6. 规范合理使用空格。

    1. 【推荐】逻辑运算符两侧建议使用空格;
    2. 【推荐】逗号后建议添加空格,例如:group by、partition by后多个字段时
  7. 规范正确使用别名

    1. 【强制】JOIN操作时,主表和关联的表必须使用别名,且长度不宜过长。获取字段时统一使用别名获取,禁止混合使用;

    2. 【强制】WITH语句中临时表名必须使用有业务含义的名称,禁止使用a,b,a1,a2等;

    3. 【强制】字段如需要使用别名,字段与别名之间必须使用AS关键字;

    4. 【强制】嵌套查询里,外层禁止使用内层表的别名,建议使用不同的别名,增加可读性

  8. 【强制】两表关联时建议使用JOIN关键字,不推荐使用

 select c1,c2 from table1 t1, table2 t2 where t1.j1=t2.j1 

5 工程规范

  1. ETL脚本独占一个文件,以.sql结尾
  2. 在关键逻辑处添加必要注释,格式 /* 这里是注释 */, 且独占一行
  3. 一个脚本文件一般对应一张数据表的生成,不建议一个文件生成多张表的数据
  4. 脚本结尾必须增加分号,且分号独占一行。Note1
  5. 若脚本有参数,参数名称必须大写,如${hiveconf:EXEC_DATE}

6 SQL最佳实践

6.1 SQL调优

  1. 禁止distinct *。
  2. 全量分区表必须添加分区字段过滤条件。
  3. 避免使用IN和NOT IN子查询。使用JOIN代替,或者使用EXISTS 或 NOT EXISTS 代替。在spark sql执行时,in和not in会被优化器处理成broadcast。
  4. join后必须添加join条件,且请避免使用OR,如果必须使用OR,请关联2次,再UNION。
  5. 如果某部分逻辑被重复使用,且数据集不大,可以使用cache table。sql结尾必须uncache table。
  6. 在join查询中,因左表的条件会下推,而右表不会,所以where条件里不允许增加右表的过滤条件Note2。一般2种处理方式:
  7. 预处理这部分数据
  8. 将条件写到on子句里
  9. 对于join查询和group by多个字段,提前探索数据
  10. 一是避免笛卡尔积,不必要的资源浪费
  11. 二是检查是否有数据倾斜,数据倾斜的数据请特殊处理
  12. 对于join、group by和where的字段,避免在字段上做函数操作
    正例:where create_time > unix_timestamp()
    反例:where from_unixtime(create_time, ‘yyyy-MM-dd’) > now()
  13. 合并小文件,写入表时末尾添加 distribute by cast (rand() * 10 as int)。
  14. SQL bad case整理

附录

  1. Note1:一个隐藏的bug,参见
    https://issues.apache.org/jira/browse/SPARK-31955
    https://issues.apache.org/jira/browse/HIVE-10541

  2. Note2:一个前提是用户不是需要在结果集上过滤这部分数据

  3. https://blog.csdn.net/fenglei0415/article/details/102640743

  4. 规范持续补充中,规范是根据过往的经验和其他互联网企业的分享再结合小米的现状总结而来,如果大家对规范有疑义,欢迎大家批评指正。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个示例ETL任务配置规范文档: ## ETL任务配置规范 ### 1. 任务名称 任务名称应该简短、明确,能够清楚地描述任务的目的。例如:“订单数据ETL”。 ### 2. 数据来源 数据来源应该清晰地列出,包括数据源名称、数据源类型、数据源连接信息等。例如: - 数据源名称:Salesforce - 数据源类型:SaaS - 连接信息:https://login.salesforce.com ### 3. 数据目标 数据目标应该清晰地列出,包括目标数据库、目标表、目标表结构等。例如: - 目标数据库:MySQL - 目标表:orders - 目标表结构:order_id, customer_id, order_date, total_amount ### 4. 数据转换 数据转换应该清晰地列出,包括数据清洗、数据加工、数据整合等操作。例如: - 数据清洗:去除重复数据、去除空值数据 - 数据加工:计算订单金额、计算订单数量 - 数据整合:将订单数据与客户数据关联 ### 5. 调度信息 调度信息应该清晰地列出,包括调度周期、调度时间等。例如: - 调度周期:每天 - 调度时间:凌晨3点 ### 6. 错误处理 错误处理应该清晰地列出,包括错误处理策略、错误日志记录等。例如: - 错误处理策略:忽略错误数据、将错误数据记录到错误日志中 - 错误日志记录:将错误日志记录到MySQL数据库中 以上是一个简单的示例ETL任务配置规范文档,具体规范应该根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Weiyaner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值