数仓建设规划核心问题!
小A进入一家网约车出现服务公司,负责公司数仓建设,试用期主要一项 OKR是制定数据仓库建设规划;因此小 A 本着从问题出发为原点,先对公司数仓现状进行一轮深入了解,理清存在问题,然后在以不忘初心原则提出解决问题方案。相信很多数据建设者在公司发展某个阶段时都会遇到类似小 A 公司问题,也在思考或已经在执行落地解决这些问题方案,希望通过小 A 案例可以给大家一些启发。下面先看看小 A 公司数仓现状与问题
01 数据仓库现状
小 A 公司创建时间比较短,才刚过完两周岁生日没多久;业务增长速度快,数据迅速增加,同时取数需求激增与数据应用场景对数据质量、响应速度、数据时效性与稳定要求越来越高;但技术能力滞后业务增长,如实时数仓技术能力、高可用稳定保障能力、流程规范缺少等,这些能力严重滞后业务发展,甚至有些还是停留在公司创建初期 case by case 阶段。小 A 根据数据在数仓流向(以下图),从上游的业务系统测到数仓内部最后到下游数据应用梳理数据仓库建设存在问题。
业务系统侧【上游】
数据仓库首先需要对业务系统结构化业务数据、日志数据与埋点数据进行归集;数仓与上游业务系统对接主要存在以下问题:
-
缺失业务系统数据模型清单与变更同步:没有对已归集到数仓业务系统数据模型记录,业务系统数据模型发送变更也没有对数仓知会,更多是出现问题后或者是数据使用者事后告知数仓。
-
缺少统一枚举值编码与变更同步:业务系统没有统一枚举值编码,如订单状态有:下单、接单、成单,没有统一对这些枚举值进行管理;如果后面对订单状态再增加一个:取消单状态,这种变更也没有对数仓进行知会。
-
业务部门搭建各自小数仓:有些部门绕过数仓直接接入上游数据源,搭建各自的小数仓,从而导致数据孤岛、重复计算、口径不一致。
-
存在业务盲区:有些业务需要专业知识背景如:财务;有些业务规则保密级别高,无法对非业务相关员公开业务逻辑,如风控;因此无法系统梳理这些业务实体与实体之间关系,提炼指标,共享数据。
数仓内部
公司创建初期,数据量比较小、数据需求也不多、数据应用场景也比较单一更多是为了满足一下简单报表,因此数仓主要是以接单方式驱动工作,来一个需求做一个,case by case,主要是为了快速响应需求。但随着业务迅速增加,数据量暴涨,数据应用场景多样化,慢慢暴露出以下问题:
-
流程规范缺少:没有流程与规范指引数据开发者根据流程对数据进行规范化建设,导致数据分层分类不清晰,数据混乱;命名不规范,同义不同名,同名不同义;数据重复建设,冗余数据多。
-
没有体系化技术设计:无论是离线或实时数据采集、处理与分发都缺少体系化设计与搭建,更多是在前期 case by case 上面修修补补;例如在离线与实时对同一数据源进行采集;无差别对所有数据源每次全量抽取与 DWD 到 DWS 层无差别全量计算;T+1 与每小时批处理烟囱开发,同一宽表离线与实时烟囱开发、重复计算与存储;对不同应用场景无差别使用相同存储与计算等等;
-
影响无互相隔离:数仓数据存储与计算,没有与数据应用服务存储与技术隔离,存在互相之间资源抢占与问题被放大情况;同时也存在数仓底层模型设计很难兼容数据应用层模型设计需求
数据应用测【下游】
数仓需要为不同数据应用场景(风控、C 端、业务运营等)提供数据,不同数据应用需求是不一致的,存在很多差异;同时数据在不同应用场景价值也是不一样的。因此需要清楚了解下游数据应用场景与存在问题才可以更好服务数据应用方,下游主要存在以下问题:
-
对数据应用场景不了解:对下游数据需求应用场景不了解或者没有深入了解,没有针对不同场景评估技术选型,简单粗暴使用一招打天下,对不同场景使用一套计算与存储。
-
不知道数据被哪些应用访问:没有对下游应用对数据使用监控与记录,无法对数据使用情况与价值进行量化
-
没有量化数据需求优先级:对下游数据需求没有优先级评估机制,没有量化数据需求优先级
-
没有自助取数工具:下游没有取数能力,导致大部分的取数工作还是依赖数据开发来完成。数据开发大部分的时间都被临时取数的需求占据,根本无法专注在数仓模型的构建和集市层数据的建设,最终形成了一个恶性循环,一方面是数据不完善,另一方面是数据开发忙于各种临时取数需求。
-
数据接入方式多样,接入效率低:每个数据应用都要根据不同的中间存储,开发对应的代码,如果涉及多个中间存储,还需要开发多套代码,数据接入效率很低。
-
数据质量问题:数据经常因为 BUG 导致计算结果错误,最终导致错误的商业决策。
02 如何解决问题
业务系统侧【上游】
与业务系统侧协同需要跨部门沟通与合作,因此需要沟通流程与标准,让双方聚焦在公共目标;同时也要维护好你好我好的共存关系。主要是针对事前、事中、事后提出解决方案。
-
事前:与上游建立知会机制与协同流程,及时同步业务与模型变更;接管 ODS 层,控制源头,ODS 是业务数据进入数仓的第一站,是所有数据加工的源头,控制住源头,才能从根本上防止一个重复的数据体系的出现。
-
事中:通过技术手段捕捉上游元数据与字典值变更,从而方便以后问题追踪与影响分析
-
事后:通过事后复盘优化流程与迭代技术
数仓内部
数仓内部主要是要从技术体系、流程规范与数据架构等几个维度去解决这些问题。
制定流程与规范
数据开发流程:
数据开发规范:
数仓规范主要包括以下内容:
1. 基础字典【词根】
词根是企业最细粒度业务术语,是维度和指标管理的基础,通过词根可以用来统一表名、字段名、主题域名;建立和维护可收敛的词根库,业务域、主题域我们都可以用词根的方式枚举清楚,不断完善,粒度也是同样的,主要的是时间粒度、日、月、年、周等,使用词根定义好简称,数仓开发的字段命名也可以使用词根进行组合;划分为普通词根与专有词根
-
普通词根:描述事物的最小单元体,如:交易-trade。
-
专有词根:具备约定成俗或行业专属的描述体,如:美元-USD。
词根示例如下:
2. 基础规范
数据域:数据纵向分域,如下图
数据层级:数据横向分层,如下图
3. 命名规范
对模型命名标准化,规范各层(ODS、DWD、DWS、DM)命名,后期可以考虑借助类似以下命名规范工具提供效率与把控能力。
4. 规范性评估
从以下几个角度去衡量规范度
03 体系化架构设计
从横向采集、处理、增值、分发与纵向离线、实时体系化进行技术架构设计
一致性维度
一致性维度的意思是两个维度如果有关系,要么就是完全一样的,要么就是一个维度在数学意义上是另一个维度的子集。例如,如果建立月维度话,月维度的各种描述必须与日期维度中的完全一致,最常用的做法就是在日期维度上建立视图生成月维度。这样月维度就可以是日期维度的子集,在后续钻取等操作时可以保持一致。如果维度表中的数据量较大,出于效率的考虑,应该建立物化视图或者实际的物理表。这样,维度保持一致后,事实就可以保存在各个数据集市中。虽然在物理上是独立的,但在逻辑上由一致性维度使所有的数据集市是联系在一起,随时可以进行交叉探察等操作,也就组成了数据仓库。
一致性事实
在建立多个数据集市时,完成一致性维度的工作就已经完成了一致性的 80%-90%的工作量。余下的工作就是建立一致性事实。一致性事实和一致性维度有些不同,一致性维度是由专人维护在后台(Back Room),发生修改时同步复制到每个数据集市,而事实表一般不会在多个数据集市间复制。需要查询多个数据集市中的事实时,一般通过交叉探查(drill across)来实现。为了能在多个数据集市间进行交叉探查,一致性事实主要需要保证两点。第一个是 KPI 的定义及计算方法要一致,第二个是事实的单位要一致性。如果业务要求或事实上就不能保持一致的话,建议不同单位的事实分开建立字段保存。这样,一致性维度将多个数据集市结合在一起,一致性事实保证不同数据集市间的事实数据可以交叉探查。
数据应用侧【下游】
针对数据应用侧解决思路主要是提高取数效率,减少数据质量问题,数据和接口复用,具体如下。
提高数据质量
要想提升数据质量,最重要的就是“早发现,早恢复”:
-
早发现,是要能够先于数据使用方发现数据的问题,尽可能在出现问题的源头发现问题,这样就为“早恢复”争取到了大量的时间。主要方法是在数据产出任务运行结束后,启动稽核校验任务对数据结果进行扫描计算,判断是否符合规则(完整性规则、一致性规则、准确性规则)预期。
-
早恢复,就是要缩短故障恢复的时间,降低故障对数据产出的影响。主要方法是基于数据血缘关系,建立全链路数据质量监控。对链路中每个表增加稽核校验规则之后,当其中任何一个节点产出的数据出现异常时,你能够第一时间发现,并立即修复,做到早发现、早修复。
建设可视化的取数平台
靠别人取数,会存在大量的沟通和协作的成本,同时因为公共集市层数据不完善,导致无法基于现有的数据,直接完成取数,需要数据开发加工新的数据,所以耗时会非常的长,一般需要一周时间。
高昂的取数成本,压制了取数的需求,也导致探索式的数据分析,根本不可能大规模的使用。通过自助取数平台,释放取数效能,将大部分取数由非技术人员的需求方完成。通过以下几点建设自助取数平台:
-
用图形化的方式,替代了写 SQL 的方式;
-
提供了对业务人员比较友好的业务过程、指标、维度的概念,替换了表、字段;
-
每个指标的业务口径都能够直接显示;
-
用户通过选取一些指标和维度,添加一些筛选值,就可以完成取数过程;
-
界面非常简洁,使用门槛非常低。
相关文章:

数仓建设规划核心问题!
小A进入一家网约车出现服务公司,负责公司数仓建设,试用期主要一项 OKR是制定数据仓库建设规划;因此小 A 本着从问题出发为原点,先对公司数仓现状进行一轮深入了解,理清存在问题,然后在以不忘初心原则提出解…...

容器镜像的导入导出
容器镜像的导入导出 第1关:导入导出容器 任务描述 本关任务是学习导入导出容器,要求学习者参照示例完成将busyboxContainer容器的文件系统保存为一个tar包,通过该tar包导入一个busybox:v1.0镜像。 相关知识 将 "容器的文件系统&…...

Java每日一练(20230502)
目录 1. 二叉搜索树的最近公共祖先 🌟🌟 2. 随机分组问题 🌟 3. K 个一组翻转链表 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…...

JVM学习(九):堆
一、堆(Heap)的概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。同时,堆内存的大小是可以调节的。《Java虚拟…...

golang - switch
switch 的使用 switch 语句用于基于不同条件执行不同操作,,直每一个 case 分支都是唯一的,从上到下逐一测试到匹配为止匹配项后面也不需要再加 break switch 表达式 {case 表达式1, 表达式2, ... :语句块1case 表达式2, 表达式3, ... :语句块…...

浙大数据结构与算法一些有意思的理论基础题
堆栈 有人给出了堆栈用数组实现的另一种方式,即直接在函数参数中传递数组和top变量(而不是两者组成的结构指针),其中Push操作函数设计如下。这个Push函数正确吗?为什么? #define MaxSize 100 ElementTyp…...

【热门框架】Mybatis-Plus怎样进行映射匹配兼容?Mybatis-Plus的ID有哪些生成策略
Mybatis-Plus提供了两种映射匹配兼容的方式:驼峰转下划线和全局配置。 驼峰转下划线 默认情况下,Mybatis-Plus会将Java类中的驼峰命名方式自动映射到数据库表中的下划线命名方式。例如,Java类中的userName属性会自动映射到表中的user_name字…...

Http1.0 、1.1、2.0、3.0的区别
巨人的肩膀 3.1 HTTP 常见面试题 | 小林coding HTTP1.0与HTTP1.1 HTTP1.1在HTTP1.0上的改进: 使用长连接的方式改善了HTTP1.0中短连接造成的性能开销支持管道网络传输,不必等到上一个的响应,就可以接着发送第二个请求,减少整体响…...

Python——基于YOLOV8的车牌识别(源码+教程)
目录 一、前言 二 、完成效果 三、 项目包 四、运行项目 (教程) 一、前言 YOLOv8LPRNet车牌定位与识别https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一个车牌识别的小需求,今天完成了,在此记录和分享 首先&#x…...

c# 数据保存为PDF(一) (spire pdf篇)
文章目录 前言了解 Spire使用Spire.PDF1 创建简单的PDF文档2 创建带有格式的PDF文档(使用Draw)头部信息页眉页脚测试数据完整的代码 3 创建带有格式的PDF文档(使用Gird)小结 先上一个效果图 前言 项目中需要将一些数据转存为PDF …...

Stable Diffusion使用方法
SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…...

高性能:负载均衡
目录 什么是负载均衡 负载均衡分类 服务端负载均衡 服务端负载均衡——软硬件分类 服务端负载均衡——OSI模型分类 客户端负载均衡 负载均衡常见算法 七层负载均衡做法 DNS解析 反向代理 什么是负载均衡 将用户请求分摊(分流) 到不同的服务器上…...

Matplotlib 安装介绍
文章目录 安装步骤 Matplotlib 不止是一个数学绘图库,它也是可视化和分析工具中最流行之一。我们可用其制作简单的图表,如折线图和散点图。 安装步骤 先进入:python官网 跳转到界面: 录入并搜索 下载之前,看一下自…...

DNS:关于 DNS 基本概念的一些笔记整理
写在前面 分享一些 DNS 的笔记整理博文内容涉及: DNS 历史介绍DNS 解析顺序DNS 基本概念资源类型介绍DNS 安全 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺…...

机器人学一些知识
机器人动力学模型是用数学方法描述机器人运动和力学特性的模型。它包含机器人的几何结构、质量、惯性、摩擦等物理特性,以及机器人的控制系统和传感器等。机器人动力学模型可以用于机器人的运动规划、控制算法设计、仿真和优化等应用中。 机器人动力学模型通常采用…...

应用,auto,内联函数
6.引用: //指针 int main() {int a 0;int& b a;int& c b;int& d c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;b;d;cout << a <<…...

Flask框架的学习---01
1.工程搭建: (1) 安装flask: pip3 install flask (2)命令行: (1)终端运行:flask run (2)绑定IP地址和端口:Flask run -h 127.0.0.1 -p 8083 修改端口号 (3࿰…...

免费gpt-4-国内使用gpt-4
如何用上gpt-4 GPT-4尚未正式发布和公开,因此我们无法提供对GPT-4的具体使用方法。但是,可以从GPT-4的前一代——GPT-3的使用经验和GPT-4的预期功能来看,建议如下: 了解GPT-4的语言处理能力和适用场景:GPT-4预计将进一…...

《程序员面试金典(第6版)面试题 16.09. 运算
题目描述 请实现整数数字的乘法、减法和除法运算,运算结果均为整数数字,程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算。 你的实现应该支持如下操作: Operations() 构造函数minus…...

asp.net基于web的校园美食派送配送系统
1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…...

【JAVA】#详细介绍!!! 文件操作之File对象(1)!
本文内容不涉及文件内容操作,主要是对指定文件元信息的获取,以及通过java代码如何创建一个文件或者删除文件 目录 文件操作的File对象 File对象的基本操作方法 得到文件(夹)对象的信息元 1.getParent 2. getName 3.getPath 4…...

Vue基本的内置指令
前言 除了常见的v-bind,v-for,v-if,v-on.v-model等,本次学习一些vue提供的其他内置指令 1 v-text 给标签插入文本,类似于插值语法 它会把全部的字符串当成文本去解析,不会当成标签的,哪怕写的是标签结构 效果和插值语法是一样的 插值语法比v-text更加…...

华为孟晚舟当值首秀:2030年AI算力将增长500倍!
作者 | 范智林 来源 | 华商观察 微信号:HuashangGC 孟晚舟当值首次亮相。 4月19日,华为副董事长、轮值董事长、CFO孟晚舟在华为第20届全球分析师大会上进行演讲,这是她当值华为轮值董事长以来的首次公开亮相。 按照华为内部规定,…...

关于python异常的总结
Python异常是在程序执行时发生的错误,可能会导致程序终止运行。 在Python中,异常处理是一种机制,它允许开发人员在程序发生异常时捕获、处理和报告这些异常,以便程序可以继续运行或在出现异常时进行优雅的退出。 在Python中&…...

基于Java+SpringBoot+vue学生学习平台详细设计实现
基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…...

【云原生网关】Kong 使用详解
目录 一、前言 二、Kong介绍 三、Kong核心组件 3.1 kong组件介绍 3.1.1 Kong Server 3.1.2 Apache Cassandra/PostgreSQL 3.1.3 Kong dashboard 3.2 传统网关与Kong工作模式对比 四、Kong网关特征与架构 4.1 kong网关特征 4.1.1 可扩展性 4.1.2 模块化 4.1.3 在任…...

浅谈之Java多线程
Java多线程是Java语言中一个非常重要的特性,它允许程序同时执行多个任务。通过多线程,程序可以同时处理多项任务,从而缩短程序的执行时间。另外,多线程也有助于利用多核处理器,更好地发挥计算机硬件的性能。 那我们在…...

【Vue3学习笔记1】一个清单应用帮你入门Vue.js
Vue 目前已经是国内最流⾏的前端框架之⼀,Vue 3 带来的诸多优化更是让前端圈迎来了新的潮流,比如: 基于 Proxy 的全新响应式实现; Composition API <script setup> 组织代码的更优方式; 更有料的 TypeScript 支…...

go破冰之旅·8·go函数基本实践及各种玩法
一次5-10分钟即可搞定,以干货效率的学习方式带你更直观的玩转各种玩法! 行文不易,一字一句纯手打创造,倾注了不少精力,感谢支持。 目录 什么是函数?有哪些元素? 函数参数、返回值 小程序&…...

Qt - 从零到壹的 打地鼠 游戏
❤️🔥欢迎收看西北风的blog,好男人就是我,我就是西北风。✨ Gitee 地址 W_A_Mole NTC_jason/cc语言 - 码云 - 开源中国 (gitee.com) 目录 🟥一:创建一个主窗体 🟣二.:添加主窗口背景图片…...