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

打印 上一主题 下一主题

主题 934|帖子 934|积分 2804

今天想跟大家聊聊,在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,存放上一日数据

就以上图为例:客户资料表在HDM-->hdm.h_88097_custr 
                         客户资料表在BDM-->bdm.b_88097_custr
表字段就拿一两个举例子
1.1, 先建个临时表01

--字段直接复制目标表字段。
  1. drop table if exists bdm.tmp_88097_custr_01 ;
  2. create table if not exists bdm.tmp_88097_custr_01 
  3. like bdm.b_88097_custr ;
复制代码
1.2,将上一日全量数据插入临时表01

  1. insert overwrite table bdm.tmp_88097_custr_01 partition (part_dt = '${batch_date_8}')
  2. select   etl_dt    --数据日期 yyyymmdd
  3.         ,fund_id   --产品编号
  4.         ,tatistic_date ---统计日期
  5. from  bdm.b_88097_custr
  6. where part_dt = FROM_UNIXTIME(UNIX_TIMESTAMP(date_sub('${batch_date_10}',1),'yyyy-mm-dd'),'yyyymmdd')
  7. ;
复制代码
2,建立临时02,存放当日比对更新后的全量数据

2.1,建立临时02

--字段直接复制目标表字段。
  1. drop table if exists bdm.tmp_88097_custr_02 ;
  2. create table if not exists bdm.tmp_88097_custr_02
  3. like bdm.b_88097_custr ;
复制代码
2.2,将上一日全量数据与当日增量数据举行比较

--将上一日全量数据中无变化的数据插入到临时表02中
无变化数据etl_date保持原样
  1. insert overwrite table bdm.tmp_88097_custr_02 partition (part_dt = '${batch_date_8}')
  2. select   t1.etl_dt    --数据日期 yyyymmdd
  3.         ,t1.fund_id   --产品编号
  4.         ,t1.tatistic_date ---统计日期
  5. from  bdm.b_88097_custr   t1 上一日全量数据
  6. where  not exists (select  t2.fund_id   --产品编号
  7.                           ,t2.tatistic_date ---统计日期
  8.                    from    hdm.h_88097_custr  --当日变化数据
  9.                    where  t1.fund_id = t2.fund_id
  10.                     and   t1.tatistic_date = t2.tatistic_date
  11.                     and   t2.etl_dt  = '${batch_date_8}'
  12.                   )
  13. ;
复制代码
3,将当日变化数据插入临时表02中,累积成当日的全量数据,

当日变化数据etl_date利用当日数据日期
  1. insert into table bdm.tmp_88097_custr_02 partition (part_dt = '${batch_date_8}')
  2. select  '${batch_date_8}'  as etl_dt    --数据日期 yyyymmdd
  3.         ,fund_id   --产品编号
  4.         ,tatistic_date ---统计日期
  5. from  hdm.h_88097_custr  --当日变化数据
  6. where  etl_dt = '${batch_date_8}'
  7. ;
复制代码
4,目标表数据落地

  1. insert overwrite table bdm.b_88097_custr partition (part_dt = '${batch_date_8}')
  2. select   etl_dt    --数据日期 yyyymmdd
  3.         ,fund_id   --产品编号
  4. from  bdm.tmp_88097_custr_02  --当日比对更新后的全量数据
  5. where  part_dt = '${batch_date_8}'
  6. ;
复制代码
ok,这样子颠末上面4个步骤,就把HDM增量的数据加载到BDM层全量数据。
E,为什么要举行数据加载算法???

emmmm,这真的是个好问题,为什么要举行这些加载算法呢,固然是为了背面方便拿来利用啊!!
起首,HDM贴源层,咱们肯定是不能去变动的,因为它代表了业务源数据,我们业务表如果开发有问题,我们是要通过HDM层来核查数据的。
BDM层基础层的表,是经常要被CDM,MDM层,拿来利用的,在利用之前,主要是做一些基础的数据加载转换,比如某些特别的字段要颠末处置处罚获取,比如说一些字段的数据范例可能要先举行转换,比如说要增长标识字段,对数据提前打标签等。数据加载算法,固然也是非常焦点的一点,就是通过处置处罚,我们在后续的计算之时,减小数据存储,尽可能的提升计算效率。
CDM公共层数据,固然是做一些轻粒度的汇总,减少后续重复开发。
MDM层是应用层,是最终指标落地的表。
-----------------------------------------------------------------------------------------------------------------------
哈哈哈当我写完这些东西的时候,感觉有那么一些无敌,因为这些ETL的工作,以及业务需求的开发工作,咱又不是没有做过。这些对于资深大数据开发职员来说,可能不是很难,但是对每个刚踏入这一行不久,或者说没有全流程开发过的小同伴来说,是所有的基石,也特别重要。
欢迎一键三连,您的支持是我费尽心血创作最大的动力!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表