【Hive实战】数据仓库设计

news2024/12/30 9:59:26

数仓中的数据分层

文章目录

  • 数仓中的数据分层
    • 维度模型
      • 维度建模下的主要概念
        • 维度表
        • 事实表
    • 结合维度模型分析数据分层
      • 贴源层 (Operation Data Store)
      • 公共维度层 CDM(Common Data Model)
        • 数据细节层 DWD(Data Warehouse Details)
        • 数据中间层 DWM(Data Warehouse Middle)
        • 数据服务层 DWS(Data Warehouse Service)
    • 数据应用层 ADS(Application Data Service)
  • Hive元数据仓库
    • ODS_SOR层
    • CDM_DWS层
      • 表分区层级分区数量表
        • 表设计
    • ADS层
      • 表一级分区的数量警示表
        • 表设计
      • 表二级分区的数量警示表
        • 表设计
      • 表分区级别警示表
        • 表设计
      • 序列化表中存在不指向存储信息表的记录表
        • 表设计

为什么会出现数据分层?

  • 对数据开发流程进行规范
  • 明确数据结构,方便使用
  • 进行有效的数据管理
  • 保障数据质量

维度模型

维度建模是面向分析场景的,针对分析场景构建数仓模型;重点关注快速、灵活的解决分析需求,同时能够提供大规模数据的快速响应性能。主要应用于数据仓库构建和OLAP引擎低层数据模型。

优点:不需要完整的梳理企业业务流程和数据,实施周期根据主题边界而定,容易快速实现demo,而且相对来说便于理解、提高查询性能、对称并易扩展。

维度模型更侧重于完成具体的分析决策需求,是一种从下往上的构建思路。同时,它关注大规模复杂查询的响应性能,星型模型是其具体形式。

维度建模下的主要概念

维度表

维度表又称维表,维表存储的一般是对事实描述的信息。每一张维表对应现实世界中的一个对象或者概念。例如:用户、商品、日期、地区等。

高基数维度数据:数据量可能是千万级或者上亿级别,比如用户资料表、商品资料表类似的资料表。

低基数维度数据:数据量可能就是个位数或者几千几万,一般是配置表,比如枚举字段对应的中文含义,或者日期维表等。

事实表

事实表主要围绕业务过程设计,表中的每行数据代表一个业务事件(下单、支付、退款、评价等)。每一个事实表的行包括:具有可加性的数值型的度量值、与维表相连接的外键。通常具有两个和两个以上的外键,外键之间表示维表之间多对多的关系。

事实事务表

用于描述业务过程,按业务过程的单一性或多业务过程可进一步分为单事务事实表和多事务事实表。其中单事务事实表分别记录每个业务过程,如下单业务记入下单事实表,支付业务记入支付事实表。多事务事实表在同一个表中包含了不同业务过程,如下单、支付、签收等业务过程记录在一张表中,通过新增字段来判断属于哪一个业务过程。

结合维度模型分析数据分层

通用的分层(自上而下):应用层,加工汇总层,贴源层

维度模型常用的分层(自上而下):数据应用层,数据仓库层(数据细节层、数据中间层、数据服务层),贴源层(SSA层,SOR层)

在这里插入图片描述

贴源层 (Operation Data Store)

贴源层可以细分为SSA层(system-of-records-staging-area)和SOR层(system-of-record)。

SSA层 是直接复制源数据的,除了需要版本化时增加数据采集的时间戳外,与源系统数据的原貌是一致的,包括错误值,空值等等。

SOR层 在学术上的一种解释是基于模型开发的符合数据库3NF范式规则的表结构,存储着数据库中最细最底层的数据。在实际操作中不一定满足第三范式,且如果源系统的数据本身就是结构化的数据(如Mysql数据库的数据),可以直接存入此层。

公共维度层 CDM(Common Data Model)

数据细节层 DWD(Data Warehouse Details)

该层是业务层和数据仓库的隔离层,保持和ODS层一样的数据颗粒度;主要是对ODS数据层做一些数据的清洗和规范化的操作,比如去除空数据、脏数据、离群值等。

为了提高数据明细层的易用性,该层通常会才采用一些维度退化方法,将维度退化至事实表中,减少事实表和维表的关联。

数据中间层 DWM(Data Warehouse Middle)

该层是在DWD层的数据基础上,对数据做一些轻微的聚合操作,生成一些列的中间结果表,提升公共指标的复用性,减少重复加工的工作。

数据服务层 DWS(Data Warehouse Service)

该层是基于DWM上的基础数据,整合汇总成分析某一个主题域的数据服务层,一般是宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

一般来说,该层的数据表会相对较少;一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。

DWM与DWS的边界不是很清晰,主要根据汇总聚合的条件粒度来判断。 这两个层数据都可以直接为ADS服务。

数据应用层 ADS(Application Data Service)

该层主要是提供给数据产品和数据分析使用的数据,一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用;也可能存放在hive或者Druid中,供数据分析和数据挖掘使用,比如常用的数据报表就是存在这里。

Hive元数据仓库

将Hive元数据存储库(Mysql)中的数据采集存储至Hive中进行分析。

ODS_SOR层

采集的Mysql库中的表,按天全量采集,hive表采用分区表的形式,分区字段统一day(string)格式:“yyyyMMdd”。表的命名方式采用mysql表名加前缀hive_meta_的形式。

Mysql表名Hive表名 ODS采集状态备注
DBShive_meta_dbs已采集
DB_PRIVShive_meta_db_privs已采集
TBLShive_meta_tbls已采集
COLUMNS_V2hive_meta_columns_v2已采集
TABLE_PARAMShive_meta_table_params已采集
TBL_PRIVShive_meta_tbl_privs已采集
PARTITIONShive_meta_partitions已采集
PARTITION_KEYShive_meta_partition_keys已采集
PARTITION_PARAMShive_meta_partition_params已采集
SDShive_meta_sds已采集
SERDEShive_meta_serdes已采集
SERDE_PARAMShive_meta_serde_params已采集

CDM_DWS层

新建统计表给数据应用层使用。

表分区层级分区数量表

表设计

表名T_DWS_BD_HIVE_META_PART_SAL_ED

字段名字段类型注释备注
tbl_idbigint表的主键
tbl_namestring表的名称
db_idbigint库的主键
tbl_ownerstring表的拥有主体
part_sumstring表下的分区数量若非分区表,则值为空
part_levelstring表下的分区级别若非分区表,则值为空
daystring分区字段,日期分区字段,日期格式:yyyyMMdd,每天存的是全量的数据

表依赖

  1. hive_meta_tbls
  2. hive_meta_partitions
  3. hive_meta_partition_keys

表数据来源

SELECT  hmt.TBL_ID
       ,hmt.TBL_NAME
       ,hmt.DB_ID
       ,hmt.OWNER as tbl_owner
       ,ps.PART_SUM
       ,pl.PART_LEVEL
FROM hive_meta_tbls hmt
LEFT JOIN
(
	SELECT  COUNT(hmp.PART_ID) AS PART_SUM
	       ,hmp.TBL_ID
	FROM hive_meta_partitions hmp
	WHERE hmp.day = '20230505'
	GROUP BY  hmp.TBL_ID
) AS ps
ON hmt.TBL_ID = ps.TBL_ID
LEFT JOIN
(
	SELECT  COUNT(hmpk.PKEY_NAME) AS PART_LEVEL
	       ,hmpk.TBL_ID
	FROM hive_meta_partition_keys hmpk
	WHERE hmpk.day = '20230505'
	GROUP BY  hmpk.TBL_ID
) AS pl
ON hmt.TBL_ID = pl.TBL_ID
WHERE hmt.day = '20230505';

ADS层

新建一些可供应用层直接使用的表

表一级分区的数量警示表

表设计

T_ADS_BD_HIVE_META_PART_L1A_ED

字段名字段类型注释备注
tbl_idbigint表的主键
tbl_namestring表的名称
db_idbigint库的主键
tbl_ownerstring表的拥有主体
db_ownerstring库的拥有主体
part_sumstring表下的分区数量若非分区表,则值为空
part_levelstring表下的分区级别若非分区表,则值为空
daystring分区字段,日期分区字段,日期格式:yyyyMMdd,每天存的是全量的数据

表依赖

  1. T_DWS_BD_HIVE_META_PART_SAL_ED
  2. hive_meta_dbs

表数据来源

SELECT  t1.tbl_id
       ,t1.tbl_name
       ,t1.db_id
       ,t1.tbl_owner
       ,hmd.owner_name AS db_owner
       ,t1.part_sum
       ,t1.part_level
FROM
T_DWS_BD_HIVE_META_PART_SAL_ED AS t1
JOIN hive_meta_dbs hmd
ON hmd.db_id = t1.db_id
WHERE hmd.day = '20230505'
AND t1.day = '20230505' 
AND t1.part_sum > 1800
AND t1.part_level = 1;

表二级分区的数量警示表

表设计

T_ADS_BD_HIVE_META_PART_L2A_ED

字段名字段类型注释备注
tbl_idbigint表的主键
tbl_namestring表的名称
db_idbigint库的主键
tbl_ownerstring表的拥有主体
db_ownerstring库的拥有主体
part_sumstring表下的分区数量若非分区表,则值为空
part_levelstring表下的分区级别若非分区表,则值为空
daystring分区字段,日期分区字段,日期格式:yyyyMMdd,每天存的是全量的数据

表依赖

  1. T_DWS_BD_HIVE_META_PART_SAL_ED
  2. hive_meta_dbs

表数据来源

SELECT  t1.tbl_id
       ,t1.tbl_name
       ,t1.db_id
       ,t1.tbl_owner
       ,hmd.owner_name AS db_owner
       ,t1.part_sum
       ,t1.part_level
FROM
T_DWS_BD_HIVE_META_PART_SAL_ED AS t1
JOIN hive_meta_dbs hmd
ON hmd.db_id = t1.db_id
WHERE hmd.day = '20230505'
AND t1.part_sum > 20000
AND t1.day = '20230505' 
AND t1.part_level = 2;

表分区级别警示表

表设计

T_ADS_BD_HIVE_META_PART_LA_ED

字段名字段类型注释备注
tbl_idbigint表的主键
tbl_namestring表的名称
db_idbigint库的主键
tbl_ownerstring表的拥有主体
db_ownerstring库的拥有主体
part_levelstring表下的分区级别数值大于2
daystring分区字段,日期分区字段,日期格式:yyyyMMdd,每天存的是全量的数据

表依赖

  1. T_DWS_BD_HIVE_META_PART_SAL_ED
  2. hive_meta_dbs

表数据来源

SELECT  t1.tbl_id
       ,t1.tbl_name
       ,t1.db_id
       ,t1.tbl_owner
       ,hmd.owner_name AS db_owner
       ,t1.part_level
FROM T_DWS_BD_HIVE_META_PART_SAL_ED AS t1
JOIN hive_meta_dbs hmd
ON hmd.db_id = t1.db_id
WHERE hmd.day = '20230505' 
AND t1.day = '20230505' 
AND t1.part_level > 2;

序列化表中存在不指向存储信息表的记录表

根据表关系serdes表的数据会与sds关联,serdes会通过sds标明表或者表分区的序列化与反序列信息,若不与sds关联,数据就会形成空岛。如何使用呢?

表设计

表名T_ADS_BD_HIVE_META_SERDES_UNDIRECTED_ED

字段名字段类型注释备注
SERDE_IDbigint序列化的编号
NAMEstring序列化和反序列化名称
SLIBstring使用的是哪种序列化方式
daystring分区字段,日期分区字段,日期格式:yyyyMMdd,每天存的是全量的数据

表依赖

  1. hive_meta_serdes
  2. hive_meta_sds

表数据来源

SELECT  *
FROM hive_meta_serdes a
WHERE serde_id not IN ( SELECT serde_id FROM hive_meta_sds b WHERE b.day = '20230505')
AND a.day = '20230505'; 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端(移动端)学习笔记

PC端网页和移动端网页的区别: PC端屏幕大,网页固定版心移动端屏幕小,网页多数为100% 在谷歌浏览器中可以调试移动端网页的代码 屏幕尺寸: 屏幕尺寸指的是对角线的长度,一般用英寸来度量 分辨率: PC分辨率 1920*10…

31 - 买股票的最佳时机问题

文章目录 1. 买股票的最佳时机I2. 买股票的最佳时机II3. 最佳买卖股票时机4. 买股票的最佳时机III5. 买股票的最佳时机IV 1. 买股票的最佳时机I dp数组含义,本题两个状态:持有股票、不持有股票 dp[i][1] :表示第i天不持有股票所得最多现金dp…

最时髦的AI画画,一文包教包会

最时髦的AI画画,一文包教包会 大概半年前,AI 绘画工具 Disco Diffusion 从 Text-to-Image 开发社区和设计行业,火到了普通用户的视野中。即便它界面简陋,满屏英文和代码,也“劝退”不了人们。因为对那些没有任何美术功…

kali php无法执行,直接下载或显示php文件内容

问题描述: 开启apache或nginx,访问php文件要么直接显示php文件内容,要么直接下载,这都是php文件无法解析的问题,需要nginxphp-fpm解决 1、安装NGINX 查看是否安装,如下图则已安装 #apt-cache policy ngi…

Linux安装MinIO及springboot项目整合使用实战(详细)

以往的项目,用的比较多的OSS服务是腾讯云和阿里云的存储服务,不过从去年到今年,最近的几个项目,普遍要使用Minio,所以我在开发服务器和测试服务器上都装上了minio 一、首先minio的安装 MInIO的安装有很多方法、单实例的、集群分…

Django学习——安装、创建项目、数据库、用户管理案例

目录 1、 安装django 1.1django是第三方模块,用pip install django 安装: 1.2 python的安装目录 : 2、创建项目 2.1在终端创建的步骤 执行过程 2.2使用pycharm(企业版)创建 django项目 2.3对比两种方式 2.4默认…

推荐5款体积小、无广告、超实用的办公软件

大家好,我又来啦,今天给大家带来的几款软件,共同特点都是无广告、超实用,大家观看完可以自行搜索下载哦。 1.网络分析工具——Wireshark Wireshark 是一款开源的网络分析工具,它可以让你捕获和浏览网络上的数据包&am…

《我命由我不由天》蔡志忠——笔记二

目录 经典记录 天才不是天生的 如何认识自己、如何发掘和重用自己 自己拯救自己才是唯一出路 了解自己是人生第一个智慧 科学家证实,成就与选择目标的年龄成反比! “努力无用论” 经典记录 天才不是天生的 美国物理学家理查德费曼两三岁时&#x…

Ubuntu18.04 制作系统ISO镜像并物理机还原(Systemback)

简单记录使用Systemback工具打包Ubuntu系统得到iso镜像文件,并在物理机上进行还原(安装)的流程。测试结果发现,使用打包的iso文件安装得到的Ubuntu系统继承了我之前的Ubuntu系统,包括并不限于如下内容:Home…

公司新来个卷王,让人崩溃...

最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件测试技术栈,非常珍贵&#x…

母亲节营销案例大盘点,真的有被狠狠共情住

⼀直以来,节⽇营销都是品牌借势和消费者建⽴情感链接的好时机。尤其是在母亲节这个温情的⽇⼦⾥,借助催泪、温情的⼴告歌颂母爱的无私与伟⼤来打动消费,也成为品牌母亲节营销的标配。 随之⽽来的,越来越多的品牌也⾯临困局&#x…

基于粒子群算法优化的核极限学习机(KELM)分类算法-附代码

基于粒子群算法优化的核极限学习机(KELM)分类算法 文章目录 基于粒子群算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于粒子群算法优化的KELM4.测试结果5.Matlab代码 摘要:本文利用粒子群算法对核极限学习机(KELM)进行优化,并用于分…

三硬币模型——机器学习课后作业

题目要求: 给出解决代码如下: import numpy as npdef miu_calc(pii, pi, qi, yj):up_b pii * pi ** yj * (1 - pi) ** (1 - yj)up_c (1 - pii) * qi ** yj * (1 - qi) ** (1 - yj)return up_b / (up_b up_c)yj np.array([1, 1, 0, 1, 0, 0, 1, 0, 1…

MySQL数据库的备份与恢复

一、数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因: 程序错误人为操作错误运算错误磁盘故障灾难(如火灾、地震)和盗窃 二、数据…

华为OD机试 - 第一个错误的版本(Java)

一、题目描述 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff…

【seata的部署和集成】

seata的部署和集成 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取…

应用在虚机和容器场景下如何优雅上下线

在生产场景中部署的服务提供者常因业务升级或其他场景需要下线和上线的部署操作,本文总结了应用在上下线过程中会遇到的典型问题,并思考在虚机和容器场景该如何处理这些问题,规避该过程中可能出现的服务消费者的请求失败,实现应用…

人工智能学习07--pytorch16--MobileNet网络详解

MobileNet详解 DW卷积: 每个卷积核的深度为1,而不是像之前一样等于特征矩阵的深度。 每个卷积核只负责输入特征矩阵的一个channel进行卷积运算,再得到相应的输出矩阵的一个channel。 因为每个卷积核只负责一个channel,则采用的特征…

Android WebView 的 addJavascriptInterface 探究

Android WebView 的 addJavascriptInterface 探究 一、前言 Java和JS交互的方式有多种,这里探讨的方式是通过以下方式进行的交互。 webView.addJavascriptInterface(this, "JSBridge") 这篇文章是想弄明白 JavaScript 和 Java是如何实现这种方式互调的,就从源码…

C高级 day1

初始工作路径不在家目录下,在不切换路径的情况下,在家目录下创建一个subdir目录,在subdir这个目录下,创建subdir1和subdir2,并且把/etc/passwd拷贝到subdir1中,把/etc/group文件拷贝到subdir2中&#xff0c…