数仓架构之 基础数据层的数据加载算法

news2024/11/23 12:57:59

今天想跟大家聊聊,在HIVE数仓分层中,一般分为4层,在前两层中,数据贴源层(HDM)的数据是怎么加载到基础数据层(BDM)的。

A,数据加载背景

啥意思呢,我先给大家讲讲背景:我们在工作中,一般数据都是存放在HIVE中(当然,底层逻辑来讲是存放在HDFS里),但是HIVE层的数据怎么来的??

其实,在hive上游有各个不同的业务系统,它们都会把其数据同步到HIVE,然后我们会在hive里建立数仓。但大家必须知道的一个点就是,上游有各个不同的业务系统的数据都是放在oracle库,mysql,PostgreSQL,DB2,kingbase(人大金仓库)等等。表在数据库里,是不存在分区这么一个概念的,所有的数据都放在这一张表里。

贴源层(HDM)层,是由上游各个不同的业务系统的数据,同步过来的。在HDM层,我们也是直接建立一张表,把上游数据数据原封不动搬过来,比如咱们是用datax把上游表里的数据加载过来,每天同步过来的数据,我们会按照etl_date分区字段加载到表。

但是我们如何把贴源层(HDM)层的数据加载到数据基础(BDM)层呢??这是我们今天要探讨的问题。

emmmm咱们看个数仓分层图,先回忆回忆:

B,数仓分层图回忆

数仓一般分为4 层,HDM---> BDM---> CDM ---> MDM

C,HDM层到BDM层的--加载算法:

2.1,知识点:HDM层的表必然是每日分区表,分区字段为etl_date ; 

                    BDM层的表必然是每日分区表,分区字段为prat_dt .  

2.2,增量追加:HDM每日增量数据追加至BDM每日增量分区中

知识点:BDM层的表,所有的dt分区的数据加起来即历史全量的数据。比如说,银行流水表。

2.3,全量:HDM每日全量数据追加至BDM每日全量分区中

知识点:BDM层的表,每个dt分区的数据都是最新的全量的数据,可回溯数据状态情况。比如说,银行理财产品信息表。

2.4,增转全: HDM每日增量数据与BDM昨日全量分区数据比对,累积转换成BDM每日全量分区

知识点:BDM层的表,每个dt分区的数据都是最新的全量的数据。比如说,银行客户信息表。

emmmmm,前两种加载算法都很简单,但增转全还是有难度的

接下来,咱们细细说一下增转全算法的具体实现。

D,增转全算法(重点):

0,增转全示意图

1,建立临时表01,存放上一日数据

1.1, 先建个临时表01,字段直接复制目标表字段。

drop table if exists bdm.tmp_88097_custr_01 ;

create table if not exists bdm.tmp_88097_custr_01 

like bdm.b_88097_custr ;

1.2,将上一日全量数据插入临时表01

insert overwrite table bdm.tmp_88097_custr_01 partition (part_dt = '${batch_date_8}')

select   etl_dt    --数据日期 yyyymmdd 
        ,fund_id   --产品编号
        ,tatistic_date ---统计日期

from  bdm.b_88097_custr

where part_dt = FROM_UNIXTIME(UNIX_TIMESTAMP(date_sub('${batch_date_10}',1),'yyyy-mm-dd'),'yyyymmdd')
;

2,建立临时02,存放当日比对更新后的全量数据

2.1,建立临时02,字段直接复制目标表字段。

drop table if exists bdm.tmp_88097_custr_02 ;

create table if not exists bdm.tmp_88097_custr_02

like bdm.b_88097_custr ;

2.2,将上一日全量数据与当日增量数据进行比较,将上一日全量数据中无变化的数据插入到临时表02中

无变化数据etl_date保持原样

insert overwrite table bdm.tmp_88097_custr_02 partition (part_dt = '${batch_date_8}')

select   t1.etl_dt    --数据日期 yyyymmdd 
        ,t1.fund_id   --产品编号
        ,t1.tatistic_date ---统计日期

from  bdm.b_88097_custr   t1 上一日全量数据
where  not exists (select  t2.fund_id   --产品编号
                          ,t2.tatistic_date ---统计日期
                   from    hdm.h_88097_custr  --当日变化数据
                   where  t1.fund_id = t2.fund_id
                    and   t1.tatistic_date = t2.tatistic_date
                    and   t2.etl_dt  = '${batch_date_8}' 
                  )
;

3,将当日变化数据插入临时表02中,累积成当日的全量数据,

当日变化数据etl_date使用当日数据日期

insert overwrite table bdm.tmp_88097_custr_02 partition (part_dt = '${batch_date_8}')

select  '${batch_date_8}'  as etl_dt    --数据日期 yyyymmdd 
        ,fund_id   --产品编号
        ,tatistic_date ---统计日期

from  hdm.h_88097_custr  --当日变化数据
where  etl_dt = '${batch_date_8}'
;

4,目标表数据落地

insert overwrite table bdm.b_88097_custr partition (part_dt = '${batch_date_8}')

select   etl_dt    --数据日期 yyyymmdd 
        ,fund_id   --产品编号

from  bdm.tmp_88097_custr_02  --当日比对更新后的全量数据
where  part_dt = '${batch_date_8}'
;

ok,这样子经过上面4个步骤,就把HDM增量的数据加载到BDM层全量数据。

E,为什么要进行数据加载算法???

emmmm,这真的是个好问题,为什么要进行这些加载算法呢,当然是为了后面方便拿来使用啊!!

首先,HDM贴源层,咱们肯定是不能去变动的,因为它代表了业务源数据,我们业务表如果开发有问题,我们是要通过HDM层来核查数据的。

BDM层基础层的表,是经常要被CDM,MDM层,拿来使用的,在使用之前,主要是做一些基础的数据加载转换,比如某些特别的字段要经过处理获取,比如说一些字段的数据类型可能要先进行转换,比如说要增加标识字段,对数据提前打标签等。数据加载算法,当然也是非常核心的一点,就是通过处理,我们在后续的计算之时,减小数据存储,尽可能的提升计算效率。

CDM公共层数据,当然是做一些轻粒度的汇总,减少后续重复开发。

MDM层是应用层,是最终指标落地的表。

-----------------------------------------------------------------------------------------------------------------------

哈哈哈当我写完这些东西的时候,感觉有那么一些无敌,因为这些ETL的工作,以及业务需求的开发工作,咱又不是没有做过。这些对于资深大数据开发人员来说,可能不是很难,但是对每个刚踏入这一行不久,或者说没有全流程开发过的小伙伴来说,是所有的基石,也特别重要。

欢迎一键三连,您的支持是我呕心沥血创作最大的动力!!!

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

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

相关文章

将mongo查出的数据导出来,变成json,然后转Excel

在MongoDB shell或使用命令行工具(如mongo或mongosh)中,你可以将查询结果输出到JSON文件。以下是一个示例命令,它执行上述聚合查询并将结果写入名为output.json的文件: mongo your_database_name --quiet --eval db.u…

李飞飞团队关于2024年人工智能发展报告总结 (Artificial Intelligence Index Report)

目录 1 10大核心信息2 AI研究和发展2.1 核心要点2.2 核心对比信息2.3 模型是否会用尽数据2.4 基础模型发展2.5 训练模型成本 3 技术性能3.1 核心要点3.2 重要模型发布情况3.3 AI表现情况3.4 多学科、高难度评估集 (MMMU & GPQA & ARC)3.5 Agents3.6 RLHF & RLAIF3.…

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…

网络编程:服务器模型-并发服务器-多进程

并发服务器概念: 并发服务器同一时刻可以处理多个客户机的请求 设计思路: 并发服务器是在循环服务器基础上优化过来的 (1)每连接一个客户机,服务器立马创建子进程或者子线程来跟新的客户机通信 (accept之后…

达梦数据库 报错 数据类型不匹配

达梦数据库 报错 数据类型不匹配 背景描述问题分析问题处理方案1:方案2:TO_CHAR(str)CAST(value AS type)CONVERT(type,value)DBMS_LOB 包TEXT_EQUAL(n1,n2) 写在最后 背景描述 本文写于初接触到达梦(DM)数据库,之前没有用过,因此…

网络协议的分类

1.概要 网络协议可以分为三类: 封装协议路由协议功能类协议 2.分类说明 OSPF报文直接调用_ IP协议__协议进行封装,以目的地址_244.0.0.5 __发送到所有的OSPF路由器? 244.0.0.1 所有主机;244.0.0.2 所有路由器;244.0.0.6 指定…

SpringSecurity6集成数据库

本文章对应视频可在B站查看SpringSecurity6对应视频教程,记得三连哦,这对我很重要呢! 温馨提示:视频与文章相辅相成,结合学习效果更强哦! 系列文章链接 1、初识SpringSecurity,认识主流Java权限…

win10系统解除微软账户和本地账户绑定

折腾了好久,终于找到一种方法可以退出微软账号了,不过这种方法我测试是成功的,有人留言自己不成功,具体解决方法只能看这些留言了 win10当中没有注销按钮,win x 弹出的菜单里面有关闭或注销,可以选择注销…

Unity射击游戏开发教程:(15)添加推进器推进和推进器推进动画

这是一个可以添加到我的游戏中的简单而有趣的功能。当玩家按住 Shift 按钮时,速度会加快,松开 Shift 按钮时,速度会恢复到原来的速度。 这需要不同的输入检测。通常使用的是Input.GetKeyDown并传入你想要获取的key。这只会检测在当前帧期间是否按下了按钮,但如果按住,将不…

Hive的join操作

假设有三张表,结构和数据如下:-- 创建表 test_a,test_b,test_c CREATE TABLE test_a( id int, name string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t;--分别导入数据到三个表中 --test_a 1 a1 2 a2 4 a4 --test_b 1 b1 3 b3 4 b4 --…

Ubuntu 20.04在Anaconda虚拟环境中配置PyQt4

一、创建一个虚拟环境 1 创建一个python2.7的虚拟环境: conda create -n pyqt4 numpy matplotlib python2.72 在环境中安装几个需要的包: pip install Theano pip install python-opencv3.4.0.14 pip install qdarkstyle pip install dominate二、在主…

打造清洁宜居家园保护自然生态环境,基于YOLOv7【tiny/l/x】参数系列模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境,作为我们人类赖以生存的家园,其健康与否直接关系到我们的生活质量。然而,近年来,一些不法分子为了个人私利,在河边、路边等公共区域肆意倾倒垃圾,严重破坏了环境的健康与平衡。这种行为不仅损…

【Python探索之旅】选择结构(条件语句)

文章目录 条件结构: 1.1 if单分支结构 1.2 if-else 多分支结构 1.3 if-elif 多重结构: 完结撒花​ 前言 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 Python提供了顺序、选择、循环三…

2024.5.19 机器学习周报

引言 Abstract 文献阅读 1、题目 X-HRNET: TOWARDS LIGHTWEIGHT HUMAN POSE ESTIMATION WITH SPATIALLY UNIDIMENSIONAL SELF-ATTENTION 2、引言 高分辨率表示是人体姿态估计实现高性能所必需的,随之而来的问题是高计算复杂度。特别地,主要的姿态估…

AI算法-高数5.1-线性代数-向量间的关系

线性代数基础概念见:AI算法-高数5-线性代数1-基本概念、向量-CSDN博客 宋浩老师课程学习: 3.2 向量间的线性关系(一)_哔哩哔哩_bilibili 向量间的关系: ​ ​ ​ ​ 判断向量贝塔(β)是否是阿尔法(α)的线性组…

4.2 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

方法一:在程序内部设置两个字符串内容,终端返回是否匹配 运行效果: 思路: 1、先比较两个字符串的长度,如果长度不一样,则两组字符串肯定不匹配;如果长度一样,再进行内容的匹配 2、如…

红外遥控和LCD1602

26.1.1 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 0.62~0.76μm;紫光的波长范围为 0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的…

利用光学和SAR数据进行亚马逊热带雨林监测

亚马逊热带雨林,670万平方公里,物种丰富,森林历史悠久。巴西环保局用光学和SAR数据进行森林监测,主要监测森林砍伐范围、人为破坏、非法采矿和隐蔽的飞机跑道。 图 2011年12月森林砍伐范围 在SAR强度数据上,被砍伐的森…

C#语言进阶

一、简单数据结构类 1. ArrayList ArrayList是一个 C# 为我们封装好的类,它的本质是一个 object 类型的数组。ArrayList类帮助我们实现了很多方法,比如数组的增删查改 1.1 声明 using System.Collections;ArrayList array new ArrayList(); 1.2 增…

RabbitMQ--死信队列

目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者(正常消费者) 6.死信队列消费者 一、…