Dataphin离线数据开发规范

本文涉及的产品
智能数据建设与治理Dataphin,200数据处理单元
简介: 目前,用户在Dataphin上进行数据开发时,风格各异,缺乏一致性。为此,我们整理了一份开发规范文档,旨在帮助所有用户实现更高效和一致的开发流程。

背景

目前,用户在Dataphin上进行数据开发时,风格各异,缺乏一致性。为此,我们整理了一份开发规范文档,旨在帮助所有用户实现更高效和一致的开发流程。文档主要涵盖在Dataphin中进行建表、创建节点、编写代码、节点配置等数据开发阶段的规范性指导。我们欢迎大家提出改进意见,以便共同优化。

  • 以下开发规范分为三个等级:【强制】、【禁止】和【推荐】:
  • 【强制】:必须遵循的规范
  • 【禁止】:绝对不允许的做法
  • 【推荐】:强烈建议遵循的规范,但比【强制】的要求稍弱

创建文件夹

  1. 【推荐】通过文件夹体现代码模块关系,按照高内聚低耦合的原则去组织文件夹及节点代码,文件夹名称建议使用易理解的中文

【正例】

如下图,在“安全性数据应用层”中,整体结构被划分为多个子模块。每个子模块可以进一步细分为若干文件夹,将强相关的节点文件组织在一起。文件夹使用中文命名,代码文件则使用英文命名,以提高可读性和便于管理

【反例】

如下图,所有财务相关的节点代码都被扁平化地放置在一个通用的“财务”文件夹中,没有按照预算、报告生成等功能进行模块化划分,并且使用了不清晰的缩写和不一致的命名方式,无法有效反映代码的内容和功能,增加了理解和管理的难度

新建表

  1. 【强制】表命名要遵守一定的命名规范

【正例】

按照既定命名规范去命名(例如OneData规范):

  • Dataphin逻辑表命名规范如下:普通维度逻辑表dim_<业务对象编码>_<数据时效>、层级维度逻辑表dim_<业务对象名称>、枚举维度逻辑表dim_enum_自定义名称、虚拟维度逻辑表dim_virtual_自定义名称、事实逻辑表fct_<业务对象编码>_<数据时效>、汇总逻辑表<业务对象编码>_<数据时效>
  • 公共汇总表命名规范:dws_统计粒度

【反例】

随意命名,不符合通用的命名规范:

  • ods表命名以“adm_”开头
  1. 【强制】能用分区表的就不要用非分区表,数据加工中的物理表和逻辑表都应该使用分区表,可用ds作为业务日期分区。

【正例】

如下代码中用到的表都是分区表,将提升查询效率与数据管理的灵活性

【反例】

如下代码所示,使用非分区表会导致无法高效管理历史数据,并在删除重建期间数据不可用,同时难以追踪表的创建历史和版本变更

  1. 【强制】表注释及字段注释要完整清晰

【正例】

完整的字段注释,有助于在后续使用或逻辑变更过程中快速理解数据结构及代码逻辑

【反例】

当字段注释和表注释均为空时,增加了数据使用和运维的复杂性及成本

新建节点

  1. 【强制】节点名称和输出结果表名称保持一致并遵守一定的命名规范

【正例】

节点名称使用英文且和输出结果表保持一致,且遵守一定命名规范

【反例】

节点名称与输出结果表名称不一致,难以快速通过表名搜索到节点

命名规范参考如下:

节点、资源类型

命名规范

示例

虚拟节点

vt_{虚拟节点含义}

vt_data_processing_root

同步导入任务

imp_s_{表名}

imp_s_customer_data

同步导出任务

exp_{表名}

exp_dws_sales_summary

Shell节点

sh _{脚本命名}

sh_log_archival

MR节点

mr_{脚本命名}

mr_transaction_analytics

DDL 资源

{输出表名}.ddl

fact_sales_data.ddl

PYTHON 资源

{脚本命名}.py

data_parser.py

JAR

{脚本命名}.jar

DataProcessor.jar

  1. 【建议】确保项目内节点名称唯一

【正例】

当节点名称符合规范且唯一,在运维管理时,可以清晰地看到每个节点,方便进行任务的管理和故障排查

【反例】

在Dataphin项目中,节点名称重复会导致管理混乱与操作混淆,增加日志记录和监控系统精准执行的难度,从而影响问题追踪与及时解决

  1. 【推荐】跨项目引用表时,表前添加项目前缀${项目名称}

【正例】

通过在引用表前添加项目前缀${项目名称},可以高效地在Dataphin中引用跨项目空间的表,提高开发效率和代码的可维护性

【反例】

跨项目引用的其他方法虽然提供了灵活性和动态性,但也带来了代码冗余、任务依赖性强和调试困难等问题

SQL代码编写规范

  • SQL代码编写原则:
  • 代码清晰整齐:保持代码行对齐,使用一致的缩进和格式,以提高可读性。
  • 幂等性:设计每个节点保证多次执行结果一致,即节点可以安全地重跑而不会影响最终结果。
  • 结构化和层次分明:组织代码逻辑清晰,模块化设计,便于理解和维护。
  • 注释完善:在代码中添加必要的注释,解释复杂逻辑和关键步骤,以增强代码的可读性。
  • 性能优化:编写代码时考虑执行效率,优化查询速度,避免不必要的复杂操作。
  • 安全性:确保数据处理遵循安全标准,防止SQL注入等安全漏洞。
  • 可维护性:结构化代码以便于后续的修改和扩展,遵循命名规范和最佳实践。
  1. 【推荐】代码头部添加必要的注释信息,例如所属主题或数据源、功能描述、创建者、修改信息

【正例】

注释信息和方案文档的URL地址能显著提升代码的可维护性。我们编写的代码不仅为自己服务,还将在生产环境中由他人接手维护。因此,代码的可维护性至关重要。

【反例】

代码头部注释信息不足,若后续由他人维护且无相关文档,将难以理解与维护

  1. 【强制】使用行缩进模式,使得代码块结构更清晰,可以使用Dataphin的格式化工具自动格式化

【正例】

代码通过适当的缩进增强可读性

【反例】

该代码片段未有效使用行缩进模式,且代码结构不清晰、缩进不一致、缺乏注释和逻辑分段,增加了代码的阅读和维护难度

  1. 【禁止】禁止在insert语句中使用Project名称作为表名前缀

【正例】

INSERT语句中,无需指定表名前的项目名称。Dataphin将根据当前运行环境(开发或生产)自动解析并使用相应的项目名称。

【反例】

INSERT语句中,表名前添加项目名称可能导致测试时无法写入测试环境的表,甚至可能覆盖线上数据,引发故障。

  1. 【禁止】禁止使用INSERT INTO TABLE 语句,而用INSERT OVERWRITE TABLE 语句

【正例】

使用 INSERT OVERWRITE 语句向表或分区插入数据时,会替换原有数据,并且该SQL语句可以重复执行。

【反例】

INSERT INTO TABLE 用于向表或分区中追加数据,不会删除已有数据。重复执行该语句可能导致数据重复。

  1. 【禁止】避免使用 CREATE TABLE table_name AS 语句,而应采用分区表。

【正例】

使用分区表,向特定分区插入数据

【反例】

CREATE TABLE table_name AS 语句每次运行都会创建新表。若未添加删除语句,可能会导致大量垃圾表和无效的表血缘关系;而添加删除语句则会每天额外消耗一个ODPS实例,浪费集群资源

  1. 【禁止】最外层SELECT禁止使用SELECT *操作,而要需要明确指定需要的字段

【正例】

明确指定SELECT的字段,有助于提高查询性能、增强代码可读性,并且防止因表结构变化导致的潜在错误

【反例】

使用 SELECT * 时,若源表的字段数量变化,会导致查询结果的字段数量也随之变化,可能与预期的结果字段数量不一致,从而引发错误

  1. 【推荐】SELECT关键字后的字段之间的逗号(,)分隔符放在字段的前面,而不是字段后面

【正例】

将逗号置于字段之前,不仅使格式更为整洁,还在注释或删除尾部字段时更加便捷,无需单独处理上一行的逗号

【反例】

若需删除或注释掉mobile字段,同时需移除member_id后的逗号;若要在voucher_cnt后新增字段,则需在其后添加逗号,较繁琐

  1. 【强制】字段来自多个子查询时,应在SELECT关键字后的字段前加上子查询的别名

【正例】

在SELECT语句中,为每个字段添加子查询别名(如:b1.field_name),可显著提高代码的可读性,并便于快速识别字段来源

【反例】

在SELECT语句中,若字段前未使用子查询别名(例如:仅写field_name,特别是在字段名重复或子查询较多时,会导致字段来源难以辨识,增加理解难度和错误风险

  1. 【强制】在处理多层嵌套子查询时,可以通过简单的字符别名来体现层次关系。

【正例】

使用简单字符别名可使SQL语句中的字段引用更加便捷,并通过别名体现层次关系,使代码结构更清晰、易于理解。必要时,为别名添加注释以增强可读性。

【反例】

子查询中使用了简单字符别名和复杂或无意义的别名,缺乏层次关系,导致代码难以维护和理解,特别是在多层嵌套时。

  1. 【强制】避免在周期性任务节点代码前放置建表语句

【正例】

通过分离建表语句与调度逻辑,可显著提升数据处理的效率和性能。初期单独执行建表操作确保了表结构的存在,使调度节点代码(周期性任务)专注于数据处理,避免重复建表

【反例】

在调度节点代码前放置建表语句会导致资源和时间的浪费。每次运行调度节点时,都会生成ODPS实例来执行建表操作,消耗集群资源。此外,重复执行建表语句会增加任务的执行时间,尤其在大规模数据处理场景中更为明显

  1. 【禁止】避免将子查询的过滤条件置于连接条件或连接之后,应将其放在子查询内部

【正例】

针对子查询的过滤条件都放在了子查询内部,符合“高内聚”原则

【反例】

该代码将子查询b的过滤条件 b.ds = '${day_2}' 置于JOIN操作中,而子查询a的过滤条件 a.ds = '${bizdate}' 则置于JOIN之后。此外,与子查询a相关的条件 register_channel = 'Online' 和与子查询b相关的条件 change_time > '2023-01-01' 均被放置在主查询中。这种做法导致了查询逻辑复杂、可读性差和维护困难,并且增加了不必要的数据处理

相关文章
|
10月前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
10月前
|
Java 数据处理 调度
Dataphin常见问题之离线管道同步数据datax就报连接超时如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
3天前
|
分布式计算 运维 监控
Dataphin离线数仓搭建深度测评:数据工程师的实战视角
作为一名金融行业数据工程师,我参与了阿里云Dataphin智能研发版的评测。通过《离线数仓搭建》实践,体验了其在数据治理中的核心能力。Dataphin在环境搭建、管道开发和任务管理上显著提效,如测试环境搭建从3天缩短至2小时,复杂表映射效率提升50%。产品支持全链路治理、智能提效和架构兼容,帮助企业降低40%建设成本,缩短60%需求响应周期。建议加强行业模板库和移动适配功能,进一步提升使用体验。
|
10天前
|
关系型数据库 MySQL 数据库
|
10天前
|
SQL 分布式计算 关系型数据库
|
6月前
|
API 搜索推荐
|
SQL 数据采集 分布式计算
Dataphin功能大图(三)研发:设计即研发,规范建模保障数据模型与代码的一致性
在《Dataphin核心功能: 规划功能》一文中, 讲到过Dataphin的OneModel方法论将数据建设分为四层, 分别为主题域模型(建模), 概念模型, 逻辑模型和分析模型。本文将继续展开逻辑模型和分析模型的讲解。
Dataphin功能大图(三)研发:设计即研发,规范建模保障数据模型与代码的一致性
|
分布式计算 调度 MaxCompute
离线整库迁移功能升级 【Dataphin V3.11】
企业首次上云的时候,会有数据表批量同步与同步增全量数据的需求,Dataphin的离线整库迁移提供了生成批量集成管道任务的途径,适用于该场景。在Dataphin V3.11中,整库迁移功能在目标表重名检查与同步方式上都做了功能升级,一起来了解一下吧~
415 0
|
SQL 运维 数据库连接
数据集成:针对离线集成任务超时的优化策略【Dataphin V3.11】
集成任务作为数据中台和外部数据库链接的数据桥梁,常常需要应对与处理复杂的外部数据库与网络环境。一旦外部的数据库出现异常,集成任务就会卡在某个状态:如一直在尝试与数据库连接,或者在数据库过载的时候还在一直在尝试执行SQL……这些异常状态都会导致集成任务无法长时间卡住,无法完成。
328 0
|
数据采集 SQL 运维
Dataphin V3.8 版本发布丨持续提升规范建模、研发易用性、数据治理等相关能力
本次发布的V3.8版本中,Dataphin提升了客制化的能力,针对不同的客户的业务场景、组织架构和管理职责进行了适配性的升级,并持续提升了规范建模的能力以及研发的易用性。在下一个版本中,我们将针对数据治理的相关能力进行升级,简化操作链路,持续提升用户体验。
Dataphin V3.8 版本发布丨持续提升规范建模、研发易用性、数据治理等相关能力