今天想跟大家聊聊,在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
--字段直接复制目标表字段。
- 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 into 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的工作,以及业务需求的开发工作,咱又不是没有做过。这些对于资深大数据开发职员来说,可能不是很难,但是对每个刚踏入这一行不久,或者说没有全流程开发过的小同伴来说,是所有的基石,也特别重要。
欢迎一键三连,您的支持是我费尽心血创作最大的动力!!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |