数仓架构--之数据拉链表实操

数仓架构--之数据拉链表

  • 不登高山不知天之高也,不临深溪不知地之厚也
    • 拉链表定义
    • 拉链表特征
    • 拉链表加工
      • 重跑机制
      • 逻辑加工
    • 全量拉链和增量拉链
    • 全增量问题
      • 全量拉链的全增量问题
      • 增量拉链的全增量问题
    • 结尾

不登高山不知天之高也,不临深溪不知地之厚也

一句话道出求知的路劲,要想知道这个东西难不难只有去行动,去攀登。接下来在这里比较简单的讲讲数仓中的拉链表

拉链表作为处理历史数据的非常常用的表,掌握拉链表可以说掌握了数仓开发的核心,废话不多说,直接进入正题。

拉链表定义

可参考百度不详细说明,主要是记录某些数据特征在某一段时间内持续的状态

拉链表特征

  1. 开始时间和结束时间两个字段;
  2. 需要生成1-2个标志全表字段的字段,根据该字段进行数据变化的判断,如:MD5_FILED(存主键)和NON_MD5_FIELD(存主键以外的必要业务字段);
    MD5生成可以如下:select listagg(to_char(column_name)) from user_table_columns left join user_cons_columns on t2.position is not null where columnname not in (技术字段)
  3. 主键 业务主键和开始时间;
  4. 辅助字段,跑批时间、跑批字段、跑批批次等

拉链表加工

重跑机制

  1. 删除当前批次之后开链的数据
delete from 表 where start_date >=batch_date and jobname = '123'
  1. 回退闭链的数据
update 表 set end_date = date'29991231',
		load_date = sysdate,
		del_flag = '未删除状态'
	where end_date>= batch_date and end_date <> date'29991231'
	  and jobname = '123'

逻辑加工

  1. 增量数据插入临时表(逻辑加工阶段)
  2. 更新临时表加密字段(fn_md5()函数加密成32位,char类型)
update 表 set md5_field = fn_md5()
  1. 删除临时表没有变化的数据
delete from 临时表 t where t.del_flag = '未删除标示符' and exists(select 1
	from 表 tt where tt.md5 = t.md5 
		and tt.startdate <= batchdate and tt.enddate > batchdate)
  1. 闭链删除的数据
update 表 tt set enddate =batchdate,
		loaddate = sysdate,
		delflag=‘删除’
	where exists(select 1 from 临时表 t where delflag=‘删除’ tt.主键= t.主键)
		and tt.startdate <= batchdate and tt.enddate > batchdate)
  1. 闭链修改的数据
merge into 表 tt
	using(select * from 临时表 t delflag =‘未删除’)t
		on(t.主键 = tt.主键)
		when matched then update 
			set  enddate =batchdate,
				loaddate = sysdate
  1. 开链新增和修改的数据
insert into 表
select * from 临时表 where delflag = ‘未删除’

全量拉链和增量拉链

  1. 增量拉链的方式只在加工的时候限制当天数据即可
  2. 全量拉链则不需要限制
  3. 在这里需要注意全增量的问题

全增量问题

全量拉链的全增量问题

当主表是全量,而关联表用增量的时候,当有该表字段用来加工目标数据的时候是有问题的,需要注意
解决方式*关联表也用全量

增量拉链的全增量问题

当有多个关联表,且使用关联表加工目标表字段的时候,有些主表没有变动,但是关联表有变动,这种时候就需要注意保证变化的数据要是全量的。
解决方式: 可以创建一个临时表,多个表的主键union生成目标表的主键

结尾

本篇文章主要讲以上内容,未尽事项评论区见

你可能感兴趣的:(架构,数仓,数据仓库,etl,架构)