2023-数仓常见问题以及解决方案
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 的方式;
-
提供了对业务人员比较友好的业务过程、指标、维度的概念,替换了表、字段;
-
每个指标的业务口径都能够直接显示;
-
用户通过选取一些指标和维度,添加一些筛选值,就可以完成取数过程;
-
界面非常简洁,使用门槛非常低。
相关文章:
2023-数仓常见问题以及解决方案
01 数据仓库现状 小 A 公司创建时间比较短,才刚过完两周岁生日没多久;业务增长速度快,数据迅速增加,同时取数需求激增与数据应用场景对数据质量、响应速度、数据时效性与稳定要求越来越高;但技术能力滞后业务增长&…...
没关系,前端还死不了
前言 网络上的任何事情都可以在《乌合之众》书中找到答案。大众言论没有理性,全是极端,要么封神,要么踩死。不少人喷前端,说前端已死?前端内卷?前端一个月800包吃住? 对此我想说,“…...
OpenSSL-基于IP或域名生成自签名证书脚本
个人名片: 对人间的热爱与歌颂,可抵岁月冗长🌞 Github👨🏻💻:念舒_C.ying CSDN主页✏️:念舒_C.ying 个人博客🌏 :念舒_C.ying 一、安装 需要安装并配置Op…...
如何在C#中创建和使用自定义异常
C#是一种强类型语言,可以捕获和处理各种异常,从而帮助我们发现程序中出现的错误。在程序开发过程中,如果需要找到特定的错误情况并处理,这时就需要创建自定义异常。下面介绍一下如何在C#中创建和使用自定义异常。 1、什么是异常&…...
通过systemctl管理服务
文章目录 通过systemctl管理服务通过systemctl管理单一服务(service unit)使用案例服务启动/关闭/查看的练习关于systemctl命令启动/停止服务后面的后缀名是否加? 通过systemctl查看系统上所有的服务使用案例 通过systemctl管理不同的操作环境(target unit)使用案例…...
面经|小红书经营分析师
感觉面试官还挺严肃的,并且猎头说因为工作经验不够是外包岗位。 但是没想到最后败在了SQL上,很久没刷题了 平时工作中还是需要想下给公司整体带来的收益结果是什么,实际工作中不一定会用到,但是要有这个思路,面试的时候…...
abpvnext后台工作者使用quartz扩展的一些思路和使用细节记录--(未完待续)
需求背景描述: 我有一个温湿度数据采集的物联网系统,每个租户都需要定时执行若干种任务, 不同的租户, 他定时执行的间隔不一样 ,比如 A租户,数据保存间隔60秒,数据是否超限的轮询间隔是是600…...
提升应届生职场竞争力:有效策略和关键推动因素
应届生进入职场是一个关键的阶段,他们需要通过有效的方法和策略来提高自己的竞争力,以适应职场的挑战并取得成功。以下是一些可以帮助应届生提升竞争力的方法和策略,以及对其职场发展起到关键推动和支撑作用的方面。 学习和继续教育ÿ…...
PBDB Data Service:List of fossil collections(化石采集记录列表)
List of fossil collections(化石采集记录列表) 描述用法参数以下参数可用于按各种条件查询集合。以下参数可用于筛选所选内容以下参数还可用于根据分类筛选结果列表以下参数可用于生成数据存档您可以使用以下参数选择要检索的额外信息,以及要…...
centos安装SNB服务
Samba 是一种开源软件,它提供了一种让 Linux 和 Unix 系统与 Windows 操作系统相互通信的标准协议。Samba 允许 Linux 和 Unix 系统作为文件服务器和打印服务器,提供 Windows 客户端所需的服务。 具体来说,Samba 通过实现 SMB/CIFS 协议来实现…...
课程《JavaWeb基础框架程序设计》考试题下篇——数据库与表单操作用题(人事管理平台的添加员工档案信息的操作题)
文章目录 📋前言🎯第三题(40分)🎯报错以及解决方法📝最后 📋前言 这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括了三道编程题&#…...
Linux-初学者系列——篇幅4_系统运行相关命令
系统运行相关命令-目录 一、关机重启注销命令1、重启或者关机命令-shutdown语法格式:常用参数:01 指定多久关闭/重启系统02 指定时间关闭/重启系统03 实现立即关闭/重启系统04 取消关闭/重启系统计划 2、重启或者关机命令-halt/poweroff/reboot/systemct…...
无缝集成:利用Requests库轻松实现数据抓取与处理
目录 引言安装基本用法发送HTTP请求处理HTTP响应高级功能总结 引言 Requests是Python中一个常用的第三方库,用于向Web服务器发起HTTP请求并获取响应。该库的使用简单,功能强大,被广泛应用于网络爬虫、API访问、Web应用开发等领域。 本文将介…...
几种内部排序算法的cpp代码实现与分析
零、测试函数 typedef void (*SortFunc) (int*&, int);inline void swap(int &a, int &b) {int tmp a;a b;b tmp; }inline void printArr(int* a, int n) {for (int k 0; k < n; k) {std::cout << a[k] << ;}std::cout << std::endl; }…...
第3天学习Docker-Docker部署常见应用(MySQL、Tomcat、Nginx、Redis、Centos)
前提须知: (1)搜索镜像命令 格式:docker search 镜像名 (2)设置Docker镜像加速器 详见文章:Docker设置ustc的镜像源(镜像加速器) 1、部署MySQL 拉取镜像(这…...
给大家介绍四款最受欢迎的抓包神器
身为互联网人,无论在平时开发还是在测试过程中,我们都不可避免的会涉及到网络安全性,如何监测网络请求,从而最大程度的保证数据的安全,需要我们了解并掌握抓包的技巧。那么何谓抓包呢?抓包就是将网络传输发…...
解决Reids过期方案 游标遍历清除Redis过期的key
游标遍历清除Redis过期的key 为什么要清除Redis过期的Key Redis的过期清理是一种懒惰的清理方案,他不会过期后立刻清除,而是在Key被访问的时候进行删除,Redis这么做的目的就是为了提高性能降低资源开销。 具体来说,一个K…...
K8s基础10——数据卷、PV和PVC、StorageClass动态补给、StatefulSet控制器
文章目录 一、数据卷类型1.1 临时数据卷(节点挂载)1.2 节点数据卷(节点挂载)1.3 网络数据卷NFS1.3.1 效果测试 1.4 持久数据卷(PVC/PV)1.4.1 效果测试1.4.2 测试结论 二、PV、PVC生命周期2.1 各阶段工作原理…...
oracle系统查询~3
查看实例的基本信息 SQL> col host_name for a25 col instance_name for a15 col version for a15 col status for a10 set linesize 600 col host_name for a20 select instance_number,instance_name,host_name,version,startup_time,status,archiver f…...
Mybatis源码(九)— chche
Mybatis中共有三级缓存,其中一级缓存默认开启,作用范围是在sqlSession对象(同一个会话),二级缓存需要手动配置开启,作用范围是在sqlSessionFactory对象下的同一个namespace范围(所以二级缓存是可…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
