离线数仓经验之谈二-数仓开发规范

开发规范
一、数据模型
o1、横向分层
1.1 分层意义
1.2 分层模型
1.2.1 数据同步层
1.2.2 数据清洗层
1.2.3 事实模型层
1.2.4 维度模型层
1.2.5 指标模型层
1.2.6 数据应用层
1.3 层次调用
o2、纵向划域
二、命名标准
o1、术语约定
o2、脚本命名规范
o3、脚本存放规范
o4、表命名规范
o5、字段命名规范
o6、分区命名规范
三、代码开发
四、ETL参数
五、${…}自定义参数

一、数据模型
1、横向分层
1.1 分层意义
复杂问题简单化。将一个复杂的任务分为多个步骤来解决,每一层只解决特定的问题;
数据结构清晰。每一层都有其特定的作用域和职责,在使用表时能快速方便的定位和理解;
提高数据的复用性。避免烟囱式开发,提高数据运算效率;
统一数据口径。
1.2 分层模型
术语约定:
业务类数据 - 数据记录包含新增、更新
日志类数据 - 数据记录只新增,不更新
1.2.1 数据同步层
层名简写:ods
描述:指结构与源系统基本保持一致的增量或者全量数据,不做进一步的模型抽象及复杂业务逻辑处理。该层不对外提供数据访问权限。
同步原则:
           1)数据量100w以下 且 数据增速4000条/天以下:全量同步;
           2)数据量100w及以上 或 数据增速4000条/天及以上:增量同步。
           备注:数据增速以近3个月的数据情况来测算;如果是新上线的表需要和业务同学进行沟通确认数据增长情况。
生命周期:历史所有
1.2.2 数据清洗层
层名简写:dwd_parse
描述:针对ods层数据进行清洗转化,主要完成业务增量数据合并、脏数据过滤、测试数据标识、json数据解析、敏感字段静态脱敏、字段命名格式统一等操作。
           备注:对于ods表中不同粒度数据需在此层进行拆分
生命周期:天表、周表、月表:180天
1.2.3 事实模型层
层名简写:dwd_fact
描述:以业务过程作为建模驱动,基于每个具体的业务过程特点,梳理出业务总线矩阵,构建最细粒度的明细事实表和模型宽表。
生命周期:天表、周表、月表:180天
1.2.4 维度模型层
层名简写:dim
描述:基于维度建模构建全域一致性维度,降低数据计算口径和算法不统一风险,采用宽表设计的原则。
维表默认值:需要根据属性来源判断
          1)如果是基础属性,空值需要给默认值:DW_Unknown
          2)如果来源是业务流程,空值不适合给默认值
生命周期:天表、周表、月表:180天
1.2.5 指标模型层
层名简写:dws
描述:以分析的主题对象作为建模驱动,基于应用和产品的指标需求,构建公共粒度的轻度或重度汇总指标事实,为应用服务层提供相对稳定的数据模型。
生命周期:天表、周表、月表:180天
1.2.6 数据应用层
层名简写:ads
描述:基于业务需求,跨数据域或主题集成、汇总,用于各产品或各业务线个性化数据加工。
生命周期:天表、周表、月表:180天
1.3 层次调用
禁止逆向调用,比如:dws层不能调用ads层数据。
层次调用顺序:
           1)(推荐)ods -> dwd_parse -> dwd_fact -> dws -> ads
           2)(推荐)ods -> dwd_parse -> dim
           3)(临时方案)ods -> dwd_parse -> ads
          ads层优先调用dws层,dws层优先调用dwd_fact层。
2、纵向划域
用户
营销

二、命名标准
1、术语约定
表功能:
          ods层:load(数据拉取)
          dwd层:parse(数据清洗)、fact(事实模型)、model(算法模型)
          dws层:cal(数据计算)、model(算法模型)
          ads层:push(数据推送至业务生产)、rpt(数据报表)、tag(标签系统)
装载策略:ic(增量),不写默认全量数据处理
装载周期:min(分钟)、h(小时)、d(天)、w(周)、m(月)、q(季)、y(年),不写默认为天处理
数据系统:mysql、mongodb、odps、sqlserver
是否拉链:his
2、脚本命名规范
数据同步脚本:源数据库系统2目标数据库系统_源数据库名称_db_源表名称_[装载策略][装载周期]。
          举例:mysql2odps_pms_import_db_chkinaccount
数据处理脚本:原则上与输出表名一致。如果数据脚本处理涉及一读多写(多路输出),需提取多表公共业务描述作为脚本名称
         举例:
         
3、脚本存放规范
数据回流:指定文件夹[数据库]2odps,具体回流根据各业务库名细分
           举例:mysql2odps
数据推送:指定文件夹odps2[数据库] ,具体推送根据各业务库名细分
          举例:odps2mysql
          存放位置:
         
数据开发脚本存放:根据第一章数仓分层规范建立对应分层文件夹
         存放位置:
         
数据表存放位置:根据分层开发脚本建设对应分层文件夹 
          存放位置:
         
4、表命名规范
ods层表:ods_表功能(load)源数据库名称_源表名[装载策略]
[装载周期][是否拉链]
dwd_parse层表:dwd_parse_数据域_业务过程
[装载策略][装载周期][是否拉链]
dwd_fact层表:dwd_fact_数据域_业务过程_[装载策略][装载周期][是否拉链]
dim层表:dim_数据域_数据粒度_[相关描述][装载策略][装载周期][是否拉链]
dws层表:dws_表功能_数据域
[数据粒度]一级业务主题[二级业务主题][装载策略][装载周期][是否拉链]
ads层表:ads_表功能_数据域_业务应用描述
[装载策略][装载周期][是否拉链]
临时表:
视图表:view_业务描述
          备注:[]内容可以选择性添加,不写代表默认值
5、字段命名规范
参考《字段规范》
6、分区命名规范
一级分区命名设置
分区名称 分区含义 分区格式
pt 日期分区 yyyyMMdd
pt_h 小时分区 HH
pt_m 月分区 yyyyMM
pt_y 年分区 yyyy
多级分区命名设置
          多级分区使用,一级使用pt,第二级根据实际业务场景设置
三、代码开发
所有查询必须指定具体字段名,禁止使用 select 。原因:显式的指定列可以很清楚查询中返回了哪些列,方便后续的代码维护与问题排查。此外,数仓数据在ETL处理时,并非所有的情况都需要查询原表所有字段,而是其中的部分关键字段。如果数据采用列式存储,使用select * 势必会造成大量不必要的网络IO,浪费资源;
所有查询表名必须同时指定库名和表名;
子查询必须指定表别名,命名方式:tn_业务描述,n从最内层子查询开始编号,起始为1;
排序必须指定排序关键字(desc|asc);
创建表时,禁止使用系统关键字作为字段名,字段和表必须添加业务描述;
字段类型使用,目前字段类型是string,datetime,bigint, decimal,时间类型字段统一使用datetime数据类型。对于源端是boolean类型的字段,在数仓dwd_parse层统一转换为bigint类型,用 0 和 1 替代 true 和 false;
为了增强代码的可读性,必要的时候需添加代码逻辑说明,且统一使用如下格式的脚本头部注释,说明该脚本的业务用途(该项可由项目空间管理员在项目内统一配置)。
        --odps sql
        –
        --author:XXX
        --create time:2023-01-01 09:00:36
        --application:脚本用途描述
        --modify log
        --modifiedTime   modifiedBy   desc
        --xxxx-xx-xx     xxx          修改了xxx
        –
        –

调度任务必须支持重跑,比如:不能有insert into语句;手动任务必须支持幂等;
ods层级以上的表,均需生成该表数据唯一标识uid(由一个或多个维度字段通过MD5加密后生成),用于通用数据质量规则配置。
明细属性尽量下沉到对应领域的事实表或者维表,聚合指标下层到dws,ads只能是对原有指标的聚合或引用。
为了统一数据口径,parse层表需明确数据范围,不要带入当天数据,T+1处理。
四、ETL参数
参数名称 参数说明 使用样例
bdp.system.bizdate 昨天日期(yyyyMMdd) ${bdp.system.bizdate}
bizdate 昨天日期(yyyyMMdd) ${bizdate}
current_day 当前时间的日期(yyyyMMdd) [ y y y y m m d d ] 五、 [yyyymmdd] 五、 [yyyymmdd]五、{…}自定义参数
根据 b i z d a t e 参数自定义时间格式,其中 y y y y 表示 4 位的年份, y y 表示 2 位的年份, m m 表示月, d d 表示天。可以将参数任意组合,比如 bizdate参数自定义时间格式,其中yyyy表示4位的年份,yy表示2位的年份,mm表示月,dd表示天。可以将参数任意组合,比如 bizdate参数自定义时间格式,其中yyyy表示4位的年份,yy表示2位的年份,mm表示月,dd表示天。可以将参数任意组合,比如{yyyy}、 y y y y m m 、 {yyyymm}、 yyyymm{yyyymmdd}、KaTeX parse error: Unexpected character: '' at position 16: {yyyy-mm-dd}等。 ̲bizdate精确到年月日,因此${……}自定义参数也只能表示到年月日级别。
获取+/-周期的方法,如下表所示。
获取+/-周期 方法
后N年 ${yyyy+N}
前N年 ${yyyy-N}
后N月 ${yyyymm+N}
前N月 ${yyyymm-N}
后N周 ${yyyymmdd+7
N}
前N周 ${yyyymmdd-7*N}
后N天 ${yyyymmdd+N}
前N天 ${yyyymmdd-N}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《Linux驱动开发详解PDF》是一本关于Linux驱动程序开发的权威性指南。该书深入介绍了Linux内核的工作原理和驱动程序开发的实践技巧,涵盖了设备驱动的基本概念、驱动的架构设计、设备模拟、中断处理、内核锁、缓存机制、模块参数和虚拟文件系统等方面。 该书的作者Jonathan Corbet、Alessandro Rubini和Greg Kroah-Hartman都是Linux内核社区的重要人物,他们用简洁明了的语言描述了如何编写高效、可靠和安全的Linux驱动程序。读者可以通过阅读该书,掌握Linux驱动程序开发所需的基本技术,进而根据自己的需求开发出适合自己的驱动程序。 虽然本书需要一定的编程基础,但它也可以为初学者提供指导方向。该书的内容全面,能够建立起深刻的理解,并提供了众多的代码示例,这样读者可以跟着示例代码,进行实际操作和调试。 总地来说,《Linux驱动开发详解PDF》是一本值得阅读的书,它可以帮助Linux驱动程序开发者获得深入的理解、打好基础,也可以为初学者规划未来的进阶道路。 ### 回答2: Linux驱动开发详解PDF是一本介绍Linux驱动编写的教材。本书适合有一定编程基础的Linux系统程序员阅读。书籍内容非常丰富,包含了Linux内核及驱动开发的大部分内容,如字符设备驱动、内核同步原语、中断处理、定时器等。此外,书中还介绍了如何编写USB驱动、网络驱动等高级驱动。 在阅读本书之前,需要掌握C语言的基础知识以及Linux操作系统相关知识。书中涉及的Linux内核及驱动开发技术难度较高,需要有一定的编程基础和动手实践的经验。本书主要从一个内核开发者的角度讲述Linux驱动开发的细节和方法,包括了一些内核驱动的设计思路和开发方法。书中的代码示例也是非常珍贵的经验之谈,可以作为开发高质量Linux驱动的实践指南。 总之,《Linux驱动开发详解PDF》是一本非常优秀的Linux驱动开发实践指南,阅读本书对于想要深入学习Linux内核开发的程序员具有非常大的参考价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值