老司机带带我:数仓建模架构|维度建模剖析与案例演示

article/2025/9/28 10:05:05

       作者基于多年的大数据处理经验,当前管理着100PB+数据仓库和2000+节点的集群。持续系统化给大家分享一下关于数据仓库建设的经验总结。本系列既有数据仓库的形而上学理论体系,也有结合公司业务的实践,既有大厂如阿里巴巴,京东,头条的分享交流,也有小公司数仓迭代案例的建设分析。感兴趣的小伙伴可以私信交流。

0.数仓建模系列历史篇章回顾

 1. 先见森林:数据仓库的前世今生与体系框架 

 2. 数仓建模本质到底是什么?为什么维度建能模脱颖而出?

1.从小公司到大公司看数仓建模发展

        数仓建模到底是什么,你可能看了很多理论知识,面试也知道怎么回答,但是心中还是有很多疑惑。数仓建模/维度建模其实是一整套抽象出来的方法规范体系,发展至今内部细节及其丰富。所以要想透彻了解他,运用它,你可以通过透视他的发展之路,看它是如何抽象总结出来的。这样才能明白当企业什么场景,什么规模,才能应用什么模式,数仓建设到什么程度,而不是照搬大厂或主流的数仓建设体系。

 1.1 小公司的数仓建模之路

       有小伙伴说,数仓建模其实没那么复杂,在我工作中不就是通过hive/spark等工具开发一张张表吗?说直白点就是把公司各个业务系统数据通过调度系统每天定时抽过来,存储到Hive数据仓库里,然后基于这些数据,定时hive/spark等任务跑了很多业务需要的数据,比如报表,比如业务汇总统计数据。最终把这些数据推送到BI报表平台或者业务库。然后日常工作也就是接点新表到数仓,给业务开发一些新表等等这些。

      数仓建模其实没什么高大上的!!!!

     

      我相信很多中小公司的小伙伴也有这些疑惑,现实中很多大数据开发也是这样干的。觉得数仓建模被神话放大了。其实我刚工作时也有这种感觉。但是后来随着去大厂做数据开发,见识了几百PB数据规模,每天几十万个任务的数据仓库。才发现如果还按照之前那套搞法根本行不通。为啥呢?

      规模大的公司,PB级别的数据规模,每天上万个任务,业务快速发展,应用场景繁杂且多变,数据时间要求严格,每天新增数据TB级别,几万张甚至几十万张表,跨部门跨子公司开发人员多,大家如何保障统计的数据一致,如何复用数据降低计算成本等等这些问题,如何解决这些问题?这时候你会发现,数据仓库不仅仅是一张张表了,而是一个有着完整体系架构和规范的系统,而是一个系统化的方法体系,一个随着业务的发展,需求增加的不断丰富完善的方法体系。

1.2 大厂的数仓建设之路

        没有哪家公司上来就是王炸四带二开局的,所有公司数仓的建设也都是跟随业务的发展逐步完善的。有需求有应用场景才会有对应的解决方案,而逐步解决这些问题,解决这些需求过程中总结的成熟规范,方法,架构合起来就是一套数仓建设方案国内如阿里巴巴就抽象出了一套自己的方法体系---OneData。当然它也是以Kimball的维度建模为核心理念基础的模型方法论,同时对其进行了一定的升级和扩展,才构建了阿里集团的数据架构体系——OneData

      因为大厂的头部效应,像阿里巴巴的onedata体系就是国内很多公司数据仓库建设的的参考标杆。如下阿里巴巴OneData体系以及建模过程:

尖叫提示:

      如上OneData体系以及数仓建模过程,可谓及其完善但实施起来也很繁琐。对于Alibaba这样海量数据规模,复杂业务场景,庞大开发人员的企业来说,通过这些约束规范的流程,“浪费”人力成本来保障数据质量,最终数学期望值最高。

       但是所以对于很多小伙伴来说,没有经历过大厂的开发,去学习大厂完善的数仓建设体系会有所有种“脱离实际的感觉”,有形而上学的嫌疑。毕竟国内95%以上的公司也达不到阿里巴巴这样的数据规模和要求,当然也完全没必要搞这套,不划算。

       所以我后面讲数仓建设,维度建模都是抓住本质核心去讲,更多细节没法办法一一展开,因为对于很多公司没用应用场景。所以大家学数仓建设,维度建模只需要抓住Killball大神的核心理念基础即可,其他的旁枝末节知道即可。

 2.维度建模核心剖析与实践

2.1.维度模式设计主要四个步骤

  1. 选择业务过程
  2. 声明粒度
  3. 确认维度(也有叫标识维度)
  4. 确认事实(也有叫标识事实)

       前面说到数仓建模的本质,以及维度建模的四个步骤,对于维度建模来说其他所有的细节都是围绕这四个过程展开的。看上去这四个过程很抽象,其实几乎每个大数据开发小伙伴都经历过,只是大家不识庐山真面目,只缘生在此山中。

      其实几乎每个大数据开发都搞过数仓建模,维度建模!

      举个例子,即使你在一家小公司里,每天的工作就是用hive/spark开发一张张表,业务方需要啥数据给他计算啥数据。但其实数仓建模就藏在你开发的过程中,比如业务让你给他统计个数据,建个报表。下面我们来还原一下你建表开发前做了哪些事。

  1. 第一步:业务得告诉你开发口径吧,选择统计你们公司的什么数据?哪个业务的数据?甚至精确到哪个业务哪个过程的数据?是公司某个商品的每天交易数据?还是新增会员的信息?统计什么?好吧,我们假设业务最终告诉你统计公司A产品某个过程的浏览人数 。这其实就是维度建模的选择业务过程
  2. 第二步:前面业务告诉你统计什么业务数据。那么你还得知道他要统计的数据是按天统计明细,还是按周统计汇总,这样你建表时表里一行存放什么数据,加工什么粒度的数据得知道哇,比如业务要的是每天的交易明细,那你表里存放的数据每行粒度就是天。这个确认数据粒度的过程其实就是声明粒度。
  3. 第三步:前面业务告诉你统计公司哪个业务线哪个业务过程的数据。也告诉你是按天统计数据,每天给他出数据。但你还得知道按什么维度统计,浏览人数是PV分析,还是按UV分析,还是业务既要UV,也要PV,也要按手机号统计浏览人数。这个其实就是你最终数据的分析维度,从哪些角度分析,是从一个维度分析还是同时多个维度一起分析。这个就是数仓建模的确认维度。
  4. 第四步:上面这些都确认清楚了,分析哪个业务/过程的数据,分析的粒度是按天还是周,分析的维度有哪些。那么最后你就要考虑的是如何建表了,也就是事实表的建设。根据前面三个要求建设对应的表,通过hive/spark等生产对应的数据到表里。最后业务就可以通过使用你提供的事实表和维表进行关联,查看数据了。(当然也有很多人直接将维度退化到事实表中,省去了关联维表的机会。这个后面在说)。这个过程其实就是数仓建模的确认事实

尖叫总结:看,是不是我们在无形中完成了数仓粗放型的维度建模,只是大家没有察觉而已这里我们简单地跟大家介绍了维度建模demo版,其实也是维度建模的核心基础了。

3.维度建模:过程拆解与案例演示

     假设我们有一个电信数据源,获取的是手机连接基站等信息的数据,数据是每隔1小时上传一次。现在业务方需要通过手机连接基站的信息情况,分析一下用户手机类型,用户主要分布在哪个城市,用户运营商分类情况,挖掘一下用户工作地,居住地等情况,甚至用户性别等信息做用户画像。

  TABLE `base_station_info`(`serdatetime` string COMMENT '服务器时间标准时间戳(13位数字)', `ipaddr` string COMMENT '客户端源IP', `type` string COMMENT '数据类型', `plat` string COMMENT '系统平台', `device` string COMMENT '设备标示', `carrier` string COMMENT '运营商编码', `simopname` string COMMENT '运营商名字:联通,电信,移动,铁通,..', `lac` string COMMENT '基站lac', `datetime` string COMMENT '客户端时间(经过服务端时间矫正标准时间戳(13位数字', `mac` string COMMENT '设备Mac地址', `model` string COMMENT '设备型号', `duid` string COMMENT 'DUID(新版设备标示)', `imei` string COMMENT '设备IMEI手机串号', `serialno` string COMMENT '手机序列号', `networktype` string COMMENT '网络类型', `processtime` string COMMENT '服务器时间', `product` string COMMENT '产品线', `psc` int COMMENT 'UMTS的主要扰码', `lat` int COMMENT '基站纬度', `lon` int COMMENT '基站经度', `nearby` array<map<string,int>> COMMENT '邻区基站信息列表', `language` string COMMENT '手机语言', `cl` map<string,string> COMMENT '安卓缓存的GPS信息,安卓获取缓存经纬度', `strategy_id` string COMMENT '定向调频的策略Id', `moid` string COMMENT '匿名设备标识符,取值deviceinfo表oaid字段的值', `appkey` string COMMENT '应用的key', `apppkg` string COMMENT '应用的包名', `appver` string COMMENT '应用的版本号', `sysver` string COMMENT '系统版本号', `factory` string COMMENT '设备的厂商', `commonsdkver` string COMMENT '公共库的版本号', `token` string COMMENT '唯一ID', `data_network_type` string COMMENT '蜂窝网络类型', `dc` int COMMENT '1为离线包,2为Maven线上包,3为定制包,4为MDC版本,6为GP版本', `useridentity` string COMMENT '请求头')

 3.1.选择业务过程

        如上,开始建模前我们需要考虑自己有哪些数据源,数据的情况,以及业务方的需求,然后决定对哪种业务过程开展数据建模。这里业务方想通过手机基站连接信息分析用户情况,做用户画像。因此这里我们建模的业务过程是手机基站连接信息。

3.2声明粒度

      上面我们知道我们的数据源的粒度是小时级别,数据是每小时更新上传一次。基本数据越详细,粒度越小获取的事实就越多,可以分析的东西也就越多。原子粒度的数据具有更强大的多维性。比如按小时粒度的数据我就可以按小时,天,周,月汇总统计。但是按天的粒度的数据,可以上卷按天,周月统计,但是没法下钻按小时类别聚合了,所以一般为了防止业务变更需求,尽可能的话可以选择原子粒度的数据。这里我们就选择原子粒度的数据。

3.3确认维度

     数据粒度选择完以后,维度可以的选择空间也就固定了下来,维度的选择就很简单了。为什么呢?因为数据的详细粒度确认了事实表可以分析的主要维度。比如上面我们确认数据粒度以后,可以分析的维度也就是表里字段的度量值。比如运营商分类,手机类型分类,网络类型,当然具体看业务需要哪些分析维度,因为不需要分析的维度我们完全不用存放这些数据,浪费计算和存储空间等等。

3.4 确认事实

      所谓的确认事实,其实就是我们根据业务分析的需求,分析的数据粒度,数据分析的维度决定了最终我们要把哪些数据放到事实表,也就是我们模型(建表)里存放哪些了事实(字段)要确认好,因为你不可能所有字段都保留着,浪费资源。然后基于事实表模型进行建设开发。

        基于前面3个过程和业务确认后 ,最终我们事实表存储的字段如下,然后我们开始开发事实表中的数据。注意如下,要求我们的事实表中的数据都可以按照如下6大维度进行汇总统计(可加事实),否则事实表设计的就有问题,后续详细展开。

       总结一下,所谓确认事实,首先确认需要将哪些事实放到事实表中。其次就是确认最终数据模型。注意,我这里为了简单举例,事实表的字段没有进行过复杂加工,只是做了一些简单的数据清洗,比如数据格式的清洗,数据的归类转换,时间格式的统一等等。后面在介绍挖掘聚合类数据建模。

尖叫总结:

      维度建模4个步骤,简单演示了一下。重点是让大家体会维度建模是如何抽象出来的,以及四个步骤为啥是环环相扣,递进式的关系。后面我们继续展开维度建模。


http://chatgpt.dhexx.cn/article/mMGnHa0X.shtml

相关文章

维度建模入门

1 概念 维度建模(dimensional modeling)是专门用于分析型数据库、数据仓库、数据集市建模的方法。数据集市可以理解为是一种"小型数据仓库"。 1.1 维度表(dimension) 维度表示你要对数据进行分析时所用的一个量,比如你要分析产品销售情况, 你可以选择按类别来进行分…

数据仓库——维度建模

数据仓库——维度建模 在维度建模中&#xff0c;将度量称为“事实”&#xff0c;将环境描述为“维度” 维度表 维度表概念 维度是维度建模的基础和灵魂。在维度建模中&#xff0c;将度量称为“事实”&#xff0c;将环境描述为“维度”&#xff0c;维度是用于分析事实所需要…

维度建模基本流程总结

一、维度建模基本流程图 数据RD进行业务调研和数据现状调研&#xff0c;产出符合相关模版规范的业务知识文档和数据现状文档。数据PM也会调研相关业务产出需求设计文档&#xff0c;三方参与需求评审&#xff0c;评审通过后基建数据RD进行需求拆解&#xff0c;产出技术方案&…

维度建模的基本理论

维度建模 围绕三个问题来展开 1、怎么组织数据仓库中的数据&#xff1f; 2、怎么组织才能使得数据的使用最为方便和便捷&#xff1f; 3、怎么组织才能使得数据仓库具有良好的可扩展性和可维护性&#xff1f; 维度建模两大派系 Bill Inmon(数据仓库之父) 的企业…

Kimball 维度建模理论

一、维度建模分为两种表 事实表 存在这样一些数据&#xff0c;如行为记录&#xff0c;操作记录&#xff0c;订单&#xff0c;日志等&#xff0c;都可以作为事实表 特点&#xff1a;每条数据都有一个唯一键&#xff0c;数据通常来说不会更新&#xff0c;随着时间的增加而增加维…

维度建模示例

以库存模块和零售模块这两个模块来谈一谈维度建模的相关事项梳理库存业务中的表的构造与设计思想梳理一下缓慢变化维的处理方法与优缺这篇博客计划用周末来完成,只能简单的讨论一下建模概况,从维度建模这本书中摘录出一些重要的知识点,对于维度建模这本书的报告计划在5.1之前完…

浅谈维度建模

前言&#xff1a;本人作为BI方向相关的数据系统后端开发&#xff0c;虽然不是从事具体的数仓方面的工作&#xff0c;但是对维度建模过程有个大致了解&#xff0c;可加深对于系统现有的架构设计的理解&#xff08;比如数据模型构建&#xff0c;指标库的作用&#xff09;&#xf…

关系建模与维度建模

一、OLTP与OLAP 当今的数据处理大致可以分成两大类&#xff1a;联机事务处理OLTP&#xff08;on-linetransaction processing&#xff09;、联机分析处理OLAP&#xff08;On-Line Analytical Processing&#xff09;。 OLTP是传统的关系型数据库的主要应用&#xff0c;主要是…

数仓维度建模实例

简介 本文将介绍维度建模理论和基于自己经验的实施步骤 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用角度合理存储数据....只有数据模型将数据有序的组织和存储起来之后&#xff0c;大数据才能得到高性能、低成本、高效率、高质量的使用。一般业务…

数据仓库-基础知识(维度建模)

一、数据仓库概述 1.1 数据仓库定义 数据仓库&#xff1a;Data Warehouse&#xff0c;是为企业所决策制定过程&#xff0c;提供所有支持类型的数据集合。用于分析性报告和决策支持。数仓是一个面向主题、集成的、相对稳定、反应历史变化的数据集合&#xff0c;随着大数据技术的…

数仓:维度建模

1.背景 数据仓库的核心是展现层和提供优质的服务。ETL 及其规范、分层等所做的一切都是为了一个更清晰易用的展现层。 2.数仓架构的原则&#xff1a; 1、底层业务的数据驱动为导向同时结合业务需求驱动 2、便于数据分析屏蔽底层复杂业务简单、完整、集成的将数据暴露给分析层…

数仓建模(维度建模)

目录 一、什么是建模&#xff1f;&#xff08;为什么建模&#xff09; 二、模型的好处 三、建模的方法 四、维度建模 4.1 基本概念 4.2 为啥选择维度建模&#xff08;优缺点&#xff09; 4.2.1 优点 4.2.2 缺点 4.3 维度建模-星型模型 4.4 维度建模-维度 4.4.1 维度之…

维度建模的三种模式

1.星型模式 星型模式是维度模型中最简单的形式&#xff0c;也是数据仓库以及数据集市开发中使用最广泛的形式。 星型模式由事实表和维度表组成&#xff0c;一个星型模式中可以有一个或多个事实表&#xff0c;每个事实表引用任意数量的维度表。 星型模式的物理模型像一颗星星的形…

维度建模概述

1、维度建模 维度建模以分析决策的需求出发构建模型&#xff0c;构建的数据模型为数据分析服务。它重点解决如何更快速完成分析需求&#xff0c;同时还有较好的大规模复杂查询的响应性能。 因此&#xff0c;说白了&#xff0c;所谓的维度建模就是一种组织数据仓库的形式、模型…

ETL自学之路-02(维度建模)

一、维度建模的基本概念 1.1维度建模的定义 维度建模&#xff08;dimensional modeling&#xff09;是专门用于分析型数据库、数据仓库、数据集市建模的方法&#xff0c;数据集市可以理解为是一种小型的数据仓库。 1.2 维度表&#xff08;dimension&#xff09; 维度表示你…

维度建模

维度建模 维度模型简介 维度建模被广泛接受为数据分析的首选技术&#xff0c;因为它同时满足了两个需求&#xff1a; 1.向用户交付可以理解的数据 2.提供快速查询的性能 维度建模实体建模第三范式&#xff08;3NF&#xff09;建模适合表连接以及聚合计算的查询请求&#xff1…

数据模型建设-维度建模详解

5.2 维度建模 维度建模是一种将大量数据结构化的逻辑设计手段&#xff0c;包含维度和指标&#xff0c;它不像ER模型目的是消除冗余数据&#xff0c;维度建模是面向分析&#xff0c;最终目的是提高查询性能&#xff0c;所以会增加数据冗余&#xff0c;并且违反三范式。 维度建…

绘制彩色图的颜色直方图

计数直方图 在Opencv中已经集成了关于彩色图像直方图计算的函数&#xff0c;形式如下&#xff1a; import cv2cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])参数 images&#xff1a;array-like类型&#xff0c;要计算的图像(单张或多张)&a…

matplotlib 图像颜色直方图

参考学习 定义 cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) ->hist imaes:输入的图像channels:选择图像的通道mask:掩膜&#xff0c;是一个大小和image一样的np数组&#xff0c;其中把需要处理的部分指定为1&#xff0c;不需要处理的…

OpenCV—python 颜色直方图与直方图均衡化

文章目录 一、颜色直方图1.1 使用opencv展示直方图1.2 使用matplotlib绘制 二、直方图均衡化2.1 全局直方图均衡化与自适应均衡化2.2 使用查找表来拉伸直方图2.3 直方图均衡化—RGB2YCrCb2.4 直方图均衡化—RGB2YUV 一、颜色直方图 1.1 使用opencv展示直方图 函数 cv2.calcHis…