本文为您介绍MaxCompute数据开发规范。

在进行数据开发前,请做好数据仓库研发流程的阶段规划,了解各种角色及其职责。具体内容请参见数据仓库研发规范概述

项目空间管理规范

关于项目划分和命名规范的详解,请参见MaxCompute Project分配项目命名规范

关于项目安全管理规范的详解,请参见安全模型

DataWorks项目空间目录构建建议:
  • 数据开发时建议建立两层目录,第一层目录表示数据域(对于中间层项目)或业务线(对于应用层项目),例如日志、会员等;第二层目录表示层次,如DWD、DWS、DIM以及数据同步任务。
  • 为避免临时查询文件列表过多,建议以开发人员姓名作为文件夹的名称进行管理。

表和视图相关规范

  • 表设计规范
    说明 建议通过DataWorks的数据管理中管理配置模块进行表的分类管理规范,同时通过DataWorks的Data Studio里的表管理模块将表与对应分类关联。
  • 视图设计规范
    • 视图的命名应与表保持一致。
    • 应创建独立的刷新任务以产生视图,创建视图的脚本如下所示。
      create or replace view ***

DataWorks工作流节点设计规范

  • 工作流节点类型和命名
    • 所有工作流节点的输出命名规范
      projectname.tablename
    • 工作流节点命名规范
      节点类型 命名规范 备注
      虚拟节点 vt_{虚拟节点含义} 任务根节点
      同步节点导入任务 imp{表名}[{源库标示}] 如果存在多个源库表名重复的情况,可以增加源库标示的后缀。
      同步节点导出任务 exp{表名}[{目标库标示}] 如果存在多个目标库,可以增加目标库标示的后缀。
      数据处理节点 {输出表名}
      • 多个目标表输出的任务时选定一个主要表名作为节点名。
      • 多个任务插入同一张表的不同分区时,可以在后面建一个虚拟目标表任务。
      Shell节点 sh_{脚本命名}
      MR节点 mr_{脚本命名}
  • 资源文件命名规范

    资源名称需有后缀表示资源类型,如.java、.py、.sh等。

  • 任务设计规范
    SQL任务:
    • 每个ODPS SQL任务至少有一个输出表。
    • 脚本需支持重跑,如使用insert overwrite等语句,以便在系统错误时,重跑任务不会出现重复数据等脏数据。
    • 代码如有时间或日期参数,需采用类似{bdp.system.cyctime}的调度参数体系,以方便调试。
    • 自定义参数,采用${变量名}体系,在发布任务时进行配置。变量名=调度参数。

编码规范

  • 编写原则
    • 代码行清晰、整齐,具有一定的可观赏性。
    • 代码编写要充分考虑执行速度最优原则。
    • 代码行整体层次分明、结构化强。
    • 代码中应有必要的注释以增强代码的可读性。
    • 规范要求非强制性地约束代码开发人员的代码编写行为,在实际应用中,只要不违反常规要求,允许存在可理解的偏差。
    • 本规范在对日常的代码开发工作起到指导作用的同时也将得到不断的完善和补充。
  • 基本要求
    • 代码段中应用到的所有SQL关键字、保留字都需使用全大写或小写,例如select/SELECT、from/FROM、where/WHERE、and/AND、or/OR、union/UNION、insert/INSERT、delete/DELETE、group/GROUP、having/HAVING、count/COUNT等。不能使用大小写混合的方式,例如Select或seLECT等方式。
    • 代码段中应用到的除关键字、保留字之外的代码,都要求使用小写。
    • 四个空格为一个缩进量,所有的缩进均为一个缩进量的整数倍。
    • 禁止使用select *操作,所有操作必须明确指定列名。
    • 通常要求对应的括号在同一列上。
    说明 通过DataWorks或MaxCompute Studio编码时,可以用格式化工具对SQL代码进行格式化。
  • 数据类型
    • MaxCompute Project的表字段类型应尽量与业务系统一致。
    • 不推荐大量使用STRING类型,以免数据加工环节的数据质量问题无法及时暴露。
    • 在对精度要求极其严格的场景下谨慎使用DECIMAL类型。
    • 关于货币类型
      • 中国货币单位统一为人民币元,国际货币单位统一为美元。
      • 除非模型有特殊说明,否则中间层金额相关的数据不做任何四舍五入操作,以避免后续的汇总计算中出现不同口径的汇总结果不一致的情况。
  • DataWorks编码规范

    主要是针对通过DataWorks进行数据开发时,在DataWorks的数据开发工作台上进行代码编辑的规范。

    • 代码头部

      代码头部添加主题、功能描述、作者、日期等信息,并预留修改日志及标题栏,以便后续修改人员添加修改记录。每一行不能超过80个字符。

      DataWorks的 配置中心> 模板管理中可针对不同任务类型配置代码头部模板。例如,SQL类型任务头部模板默认为:
      --odps sql 
      --********************************************************************--
      --author:${author}
      --create time:${createTime}
      --********************************************************************--
    • 字段排列要求
      • SELECT语句选择的字段按每行一个字段方式编排。
      • SELECT单字后面一个缩进量后应直接跟首个选择的字段,即字段离首起二个缩进量。
      • 其它字段前导二个缩进量再跟一个逗号(‘,’)后放置字段名。
      • 两个字段之间的逗号(‘,’)分割符紧跟在第二个字段的前面。
      • ‘AS‘语句应与相应的字段在同一行,多个字段的‘AS’建议尽量对齐在同一列上。


    • SELECT子句排列要求
      SELECT语句中所用到的FROM、WHERE、GROUP BY、HAVING、ORDER BY、 JOIN、UNION等子句,需遵循如下要求:
      • 换行编写
      • 与相应的SELECT语句左对齐编排。
      • 子句后续的代码离子句首字母二个缩进量起编写。
      • WHERE子句下的逻辑判断符AND、OR等与WHERE左对齐编排。
      • 超过两个缩进量长度的子句加一空格后编写后续代码,如:ORDER BY、 GROUP BY等。


    • 运算符前后间隔要求
      算术运算符、逻辑运算符的前后要保留一个空格。

    • CASE语句的编写
      SELECT语句中对字段值进行判断取值的操作将用到的CASE语句,正确的编排CASE语句的写法对加强代码行的可阅读性也是很关键的一部分。对CASE语句编排的约定如下:
      • WHEN子语在CASE语句的同一行并缩进一个缩进量后开始编写。
      • 每个WHEN子语一行编写,如果语句较长可换行编写。
      • CASE语句必须包含ELSE子语,ELSE子句与WHEN子句对齐。


    • 子查询嵌套编写规范

      在数据仓库系统ETL开发中经常需要用到子查询嵌套,因此代码的分层编排变得非常重要。



    • 表别名定义约定
      建议将所有的表加上别名。一旦在SELECT语句中给操作表定义了别名,在整个语句中对此表的引用都必须惯以别名替代。考虑到编写代码的便捷性,约定别名尽量简洁,同时避免使用关键字。
      • 表别名采用简单字符命名。
      • 多层次的嵌套子查询别名之前要体现层次关系,SQL语句别名或分层的命 名,从第一层次至第四层次,分别用P、S、U、D表示,取意为Part,Segment,Unit,Detail。也可用a、b、c、d来表示第一层次到第四层次。对于同一层次的多个子句,可以在字母后加1、2、3、4…区分。
      • 必要时,为表别名添加注释。


    • SQL注释
      • 每条SQL语句均应添加注释说明。
      • 每条SQL语句的注释单独成行并置于语句前面。
      • 字段注释紧跟在字段后面。
      • 应为不易理解的分支条件表达式添加注释。
      • 应说明重要计算的功能。
      • 过长的函数实现,应将其语句按实现的功能分段加以概括性说明。
      • 常量及变量注释时,必须注释被保存值的含义,按需注释合法的取值范围 。
    • MaxCompute Project名称的编写
      本项目(Project)的项目名称不需在编码中体现,如引用了其他项目(Project) 的表则需带上项目名称。示例如下。
      --当前Project为 prj_bi
      INSERT OVERWRITE TABLE test_2
      SELECT  c1
             ,c2
             ,c3
      FROM    prj_ods.test_1
      WHERE   pt = 20181212
      ;
  • DataWorks任务发布规范
    • 发布上线的时间根据业务定义。
    • 无QA参与的项目,应由开发负责自测,开发测试环境通过后再自行发布到生产环境。
    • 有QA参与的项目,开发应负责提交到调度开发环境并测试通过,而正式上线则由 QA负责打包发布到生产环境。