数仓模型规范设计

模型架构设计

数仓架构一般从宏观上分为三层:操作数据层ODS、公共维度模型层CDM和数据应用层ADS。其中CDM又包含明细数据层DWD、汇总数据层DWS,维度层DIM、根据生产经验这里可在加入数据临时层TMP。架构图如下:
在这里插入图片描述

  1. ODS
    把操作系统的数据几乎无处理地存放在数据仓库系统中。
  • 支持历史数据回溯
  • 表结构、数据类型和数据源保持一致
  • 可以过滤敏感字段
  • 不同业务类型的表可采取不同分区策略
  1. DWD
    按业务概念组织细节数据,并进行名称、代码等标准化处理。
  • 完成数据标准化和清洗,包括命名规范、算法统一
  • 维表退化到事实表,减少事实表和维度表的关联
  • 构建明细宽表,提高明细表的易用性
  1. DWS
    根据应用的高层和产品指标要求,构造通用粒度汇总指标表。
  • 采用宽表化手段构建公共汇总层,提升指标复用性,减少重复计算
  1. DIM
    维度是对具体分析对象的分析角度,维度要具备丰富的属性,历史信息的可追溯性,对通用的维表要保持一致性。

  2. TMP
    用来降低加工过程计算难度,提高运行效率的临时表层。

  3. ADS
    这一层跟业务系统强相关(如各种BI、画像平台),可由业务方直接开发,也可由数仓团队开发,内容跟系统需求导向的。此层不作为数仓核心分层架构。

基本原则

  1. 高内聚和低耦合
    一个逻辑或者物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关、粒度相同的数据设计为一个逻辑或者物理模型:将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。
  2. 核心模型与扩展模型分离
    建立核心模型与扩展模型体系,核心模型包括的字段支持常用的核心业务,扩展模型包括的字段支持个性化或少量应用的需要,不能让扩展模型的字段过度侵入核心模型,以免破坏核心模型的架构简洁性与可维护性。
  3. 公共处理逻辑下沉及单一
    越是底层公用的处理逻辑越应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用层实现,不要让公共逻辑多处同时存在。
  4. 成本与性能平衡
    适当的数据冗余可换取查询和刷新性能,但不宜过度冗余与数据复制。
  5. 数据幂等性
    处理逻辑不变,在不同时间多次运行数据结果确定不变。
  6. 一致性
    具有相同含义的字段在不同表中的命名必须相同,必须使用字段命名规范中约定的词根。
  7. 命名清晰、可理解
    表命名需清晰、一致,表名需易于使用者理解和使用。

公共规范

  1. 层次调用约定
    应用数据层应优先调用聚合数据层及通用数据层数据,优先使用已产出的粗粒度汇总数据,不允许应用数据层跨过中间层从ODS层重复加工数据。
    一方面,数仓团队应该积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他团队提供数据服务;另一方面,应用数据层开发时也应积极配合数仓团队进行持续的数据公共建设的改造。必须避免出现过度的引用ODS层、不合理的数据复制以及子集合冗余。
  • DW层(基础数据层及通用数据层)任务的深度不宜过大。

  • 聚合数据层(DWS)应优先调用通用数据层(DWD)。在可累加类指标计算时,聚合数据层(DWS)尽量优先使用已经产出的同层粗粒度汇总数据,以避免大量汇总直接从海量的基础数据层计算。

  • 基础数据层累计快照事实表优先调用同层事务型事实表,以保持数据的一致性产出。

  • 避免应用层过度引用和依赖基础数据层明细数据,需要针对性地建设好DW公共汇总层。

  1. 数据冗余
    宽表冗余维度属性时,应该遵循以下建议原则:
  • 冗余字段与表中其它字段高频率同时访问。

  • 冗余字段的引入不应造成任务本身的完成时间产生过多后延。

  • DW层(基础明细层、数据汇总层)数据不允许字段重复率大于60%的相同粒度数据表冗余,可以选择在原表基础上拓宽或者在下游应用中通过JOIN方式实现。

  1. 数据拆分
    数据的水平和垂直拆分是按照访问热度分布和数据表非空数据值、零数据值在行列二维空间上分布情况进行划分的。
  • 在物理上划分核心模型和扩展模型,将其字段进行垂直划分。

  • 将访问相关度较高的列在一个表存储,将访问相关度较低的字段分开存储。

  • 将经常用到的where条件按记录行进行水平切分或者冗余。水平切分可以考虑二级分区手段,以避免多余的数据复制与冗余。

  • 将出现大量空值和零值的聚合数据层汇总表,依据其空值和零值分布状况可以做适当的水平和垂直切分,以减少存储和下游的扫描数据量。

  1. 空值处理原则
    【建议】
  • 事实表的空值:空值处理,填充为零。因为数据库中null值对常用数字型字段的SQL过滤条件都不生效,比如大于、小于、等于。
  • 维度属性值为空:在汇总到对应维度上时,对于无法对应的统计事实,记录行会填充为-99(未知),对应维表会出现一条-99(未知)的记录。

ODS规范设计

  1. 设计原则
    必须】一个源表只允许同步一次到数据仓库。

  2. 命名规范
    (1) 表命名规范
    [层级][源库][源表]{业务标识}[刷新周期标识][单分区增量全量标识]
    如:ods_netroam_misim_order_di
    •ods表示层级
    •netroam表示业务库名
    •misim_order表示业务表名
    •d表示刷新周期为按天更新(ODS层原则上只有按天分区数据)
    h:小时/d:天/w:周/m:月
    •i表示单分区数据为增量(f表示全量)

    必须】如来自不同业务系统表名产生冲突时,在[同步策略]之前增加{业务标识}来区分

    【建议】如接入分库分表数据时,ODS表中增加source_ip/source_db/source_tb字段以示区分,便于数据校验及问题定位

    (2)字段命名规范
    必须】字段默认与源系统字段名保持一致
    【建议】如与数仓关键字产生冲突,如etl_tm,start_day,end_day等时,字段增加后缀_dup(duplicate)区分

  3. 生命周期规范
    (1)对于业务库接入数据

数据表类型存储方式最长存储保留策略
全量按天分区ODS层数据默认保存30天,支持数据问题回溯
增量按天分区ODS层数据默认保存30天,支持数据问题回溯

(2)对于互联网日志数据

数据表类型存储方式最长存储保留策略
业务自打点且已落地工场ODS层不冗余存储,直接使用业务日志作为ODS表
onetrack日志按天分区ODS层不冗余存储,直接使用tracking库作为ODS层,互联网业务日志TTL默认180天
  1. 数据质量规范
    •【必须】业务数据ODS表必须配置主键唯一性监控(主键是后续拉链处理的关键)
    •【必须】ODS表必须进行分区空数据监控
    •【必须】ODS表所有字段均必须有注释
    •【建议】ODS表的记录数设置上周同比无变化监控,用于监控源系统是否下线或者已迁移

DWD层规范设计

  1. 命名规范
    (1)表命名规范
    [DWD/DWS][主题缩写][业务][业务流程缩写/表内容描述][模型设计方式]
    模型设计方式:流水表为{刷新周期标识}{单分区增量全量标识},,拉链表为chain
    如:dwd_event_ott_mitv_log_di/dwm_ot_device_active_chain
    •dwd表示层级
    •event表示主题
    •ott表示业务
    •mitv_log表示具体业务信息
    •chain表示模型设计方式为拉链
    (2) 字段命名规范
    这里可以维护一套词根表,让尽量让所有字段命名都统一。

  2. 生命周期规范
    互联网业务日志TTL默认180天。

DIM层规范设计

  1. 设计原则
    必须】维度表中相同维度属性在不同物理表中的字段名称、数据类型、数据内容必须保持一致;
    【建议】维度建模一般推荐将维度的属性层次合并至单个维度(反规范化),换取简明性和查询性能;
    维表的设计常见如下两种方式:
    •全量快照
    方式:每天保留一份全量快照数据;
    优点:开发维护成本低,使用方便,易于理解;
    缺点:存储冗余,未发生变化的记录需要每日冗余存储;
    注意:避免过度使用这种方法,且必须要有对应的TTL机制,清除无用历史数据;
    •历史拉链
    方式:通过新增开闭链日期,以天为粒度记录数据变更,支持快速还原任意天的历史快照;
    优点:极大地压缩了全量存储的成本
    弊端:提高了数据使用门槛与解释成本
    注意:对于频繁变化的属性,需要合理的进行水平或垂直拆分,保持核心维度的相对稳定;

  2. 命名规范
    (1)表命名规范
    DIM_{业务缩写}_{维度定义}
    如:dim_dept_user
    •dim表示层级
    dept_user表示维度定义,部门用户
    (2) 字段命名规范
    这里可以维护一套词根表,让尽量让所有字段命名都统一。

  3. 生命周期规范
    历史拉链方式设计的维表默认无TTL约束,视实际场景合理设置;
    全量快照方式设计的维表TTL建议为7天,视实际场景合理调整;

字段类型规范

数据仓库中的字段长度尽量满足相应源系统字段中最大长度的要求,当然也会考虑字段的业务含义,对于一些源系统定义过长,而从实际业务含义又不可能有那么长的字段,由仓库自行选择一个合适的长度定义;为了尽可能的保持仓库中数据类型的一致性以及规范性,数据仓库中的数据类型定义不宜过杂,建议只定义string、bigint、double类型,使得仓库中的字段类型保持整齐。

日期类型字段由于格式多样,造成在信息加工处理过程中的格式转换复杂且易出错,因此对日期类型字段统一制定如下规范。以"2020-01-01 12:57:45.233"为例说明日期字段类型规范内容:

在这里插入图片描述

分区定义规范

分区致力于解决支持大表和索引的关键问题,一旦分区被定义,SQL语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率。分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据,对于HIVE,分区实际就是对应HDFS文件系统上的的独立的文件夹,该文件夹下是该分区所有数据文件。在分区设计中通常需要从数据存储与数据访问角度考虑。以下为常用表设计的分区定义。

  • 流水表:流水表通常的加载或加工方式为增量,在使用时也经常按天的方式进行应用,通常设计date=数据日期作为分区。

  • 拉链表:拉链表设计目前采用单级分区设计,end_day=[数据日期,20991231]

  • 全量快照表:全量快照表通常设计一个date=数据日期分区,一个分区代表该天全量数据快照情况。

  • 增量快照表:全量快照表对于使用来说非常方便,但是针对于数据量巨大的表来说,这种设计通常存储巨大,访问非常慢,然而在使用时也并非需要全量的数据,这时可考虑设计为增量快照表,date=数据日期为当日修改的数据。由于一笔业务数据可能多次修改,也就是说会分布在多个dt分区,使用时需要结合业务日期使用或去重使用。

  • 归档表:对于数据量巨大表的另外一种设计方式则为归档表,归档表则将某个时间以前的数据放置到归档分区,归档日期依据业务进行定义。归档一般使用二级分区方式,例如全量快照和拉链表最新快照,配合规范可设计为[dp=ACTIVE/HISTORY, date=数据日期]或[dp=ACTIVE/HISTORY, end_day=20991231/数据日期]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452941.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高中数学:立体几何-外接球的外心法

文章目录 一、外心法定义二、习题1、例题一2、例题二3、例题三4、例题四 一、外心法定义 依然以三棱锥为例 即,找到三棱锥的外接球的球心,从而可以确定出外接球的半径R。 而三棱锥有四个顶点,这四个顶点必然都在外接球的球面上。 寻找思路…

海蓝色主题移动端后台UI作品集模板源文件分享 figmasketch格式

页面数量:30页 页面尺寸:1920*1080px 发给你的文件:作品集Figma源文件、作品集sketch源文件、部字体文件、高质量作品集包装psd样机文件(含手机和电脑样机)

设计模式概览

设计模式是一种解决常见编程问题的经验总结,提供了代码的可重用性、可扩展性和可维护性。常见的设计模式有23个,主要分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类设计模式的详细分类和讲解: 一、创建型模式 创建…

linux多窗口调试一些常用命令

在 vim 或 neovim 中使用分屏移动光标的方式: 希望光标从左窗口移动到右侧窗口: 按 Ctrlw 然后按 l(小写的 L),光标就会从左边窗口移动到右边窗口。 其它分屏操作: Ctrlw h:移动到左边的窗…

【我的 RT 学习手札】信息收集

相关笔记整理自B站up主泷羽sec全栈渗透测试教学(免费) 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线&#xff0…

11 图书借阅功能实现(Vue3+element plus +Spring Boot)

目录 1 功能描述2 接口地址3 后端代码4 api/book.js中编写借阅图书的接口代码5 BookResourcesVue.vue组件中完成点击事件borrowBook6 功能演示 1 功能描述 普通用户借阅图书,点击借阅按钮,修改图书状态,最多能够借阅3本图书。 2 接口地址 …

保证缓存一致性的常用套路

缓存更新的套路 看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是…

[MyBatis-Plus]扩展功能详解

代码生成 使用MP的步骤是非常固定的几步操作 基于插件, 可以快速的生成基础性的代码 安装插件安装完成后重启IEDA连接数据库 mp是数据库的名字?serverTimezoneUTC 是修复mysql时区, 不加会报错 生成代码 TablePrefix选项是用于去除表名的前缀, 比如根据tb_user表生成实体类U…

恒定电流下有功率密度,功率密度体积分就是恒定电流的功率

体积趋于0时,体积的功率就叫功率密度 恒定电流的 电场乘距离等于电压 电流面密度*面积等于电流注意:电流面密度不是电荷线面体密度,电荷线面体密度用在静电场中,即电荷不运动这种

redo文件误删除后通过逻辑备份进行恢复

问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在,如果存在进行下恢复。翻了服务器发现备份文件存在,多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志,赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…

ESP32_S3驱动舵机servor sg90

ESP32_S3驱动舵机servor sg90 硬件连接图硬件外观[^1]硬件引脚功能图硬件连接引脚对照表硬件接线图 Arduino IDE添加ESP32_S3开发板[^2]安装SERVO3舵机驱动库[^3]下载库ZIP包安装库 ESP32_S3程序下载方式源代码SERVO库自带例程方式二 参考文献 调试ESP32_S3舵机发现舵机不动。查…

多线程编程

使用多线程完成两个文件的拷贝&#xff0c;分支线程1&#xff0c;拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程用于回收分支线程的资源 #include<myhead.h>typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct soc…

Redis --- 第四讲 --- 常用数据结构 --- Hash、List

一、Hash哈希类型的基本介绍。 哈希表&#xff1a;之前学过的所有数据结构中&#xff0c;最最重要的。 1、日常开发中&#xff0c;出场频率非常高。 2、面试中&#xff0c;非常重要的考点。 Redis自身已经是键值对结构了。Redis自身的键值对就是通过哈希的方式来组织的。把…

【MySQL 保姆级教学】数据类型全面讲解(5)

数据类型 1. 数据类型分类1.1 数值类型1.2 文本和二进制类型1.3 日期类型 2 数值类型2.1 TINYINT 类型2.1.1 默认有符号类型2.1.2 无符号类型 2.2 INT 类型2.2.1 默认有符号类型2.2.2 无符号类型 2.3 BIT 类型2.3.1 语法2.3.2 举例 2.4 FLOAT 类型2.4.1 语法2.4.2 默认有符号类…

OpenCV高级图形用户界面(20)更改窗口的标题函数setWindowTitle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV中&#xff0c;cv::setWindowTitle函数用于更改窗口的标题。这使得您可以在程序运行时动态地更改窗口的标题文本。 函数原型 void cv::…

keepalived(高可用)+nginx(负载均衡)+web

环境 注意&#xff1a; (1) 做高可用负载均衡至少需要四台服务器&#xff1a;两台独立的高可用负载均衡器&#xff0c;两台web服务器做集群 (2) vip&#xff08;虚拟ip&#xff09;不能和物理ip冲突 (3) vip&#xff08;虚拟ip&#xff09;最好设置成和内网ip同一网段&#xf…

【Vulnhub靶场】Kioptrix Level 3

目标 本机IP&#xff1a;192.168.118.128 目标IP&#xff1a;192.168.118.0/24 信息收集 常规 nmap 扫存活主机&#xff0c;扫端口 根据靶机IP容易得出靶机IP为 192.168.118.133 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.133 Getshell 开放22端口和80 端口 访问web…

Git极速入门

git初始化 git -v git config --global user.name "" git config --global user.email "" git config --global credential.helper store git config --global --list省略(Local) 本地配置&#xff0c;只对本地仓库有效–global 全局配置&#xff0c;所有…

第十七周:机器学习笔记

第十七周周报 摘要Abstratc一、机器学习——生成式对抗网络&#xff08;Generative Adversarial Networks | GAN&#xff09;——&#xff08;中&#xff09;1. GAN 的理论介绍2. 用JS散度训练存在的问题3. WGAN 算法4. 拓展——流体 总结 摘要 本周周报主要对GAN进行了详细的…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…