背景:

业务部门提了用户分层的需求,其中有一点,业务放需要我们数仓提供历史数据,并且业务库里的部分表还没有数据更新时间字段。所以本篇文章主要解决两个问题
1:问题一 怎么再HIVE里实现拉链表
2:问题二 怎么再没有数据更新时间字段的情况下获取增量数据(个人认为这个方式也是一种通用的方式)

一:拉链表是什么?使用场景?实现原理?

1:是什么?  拉链表是一张记录事务历史变化的表,记录一个事务从开始到当前发生的所有变化。
 2:场景:我们需要获取用户的历史数据
 3: 原理:所有数据=全量数据 + 变更数据

二 HVIE 实现拉链表

以下是我实现拉链表的过程,为了实验方便使用with as语句模拟了数据

-- 1:生成实验数据
with user_1 as (select -- 表1:全量数据
    'zhangshan' as uid,123456 as phone, '1' as sex ,'2020-03-24' as start_time,'9999-12-30' as end_time
    ),
    user_2 as (select -- 表2:增量数据(用户的性别出现了便跟)
    'zhangshan' as uid,123456 as phone, '0' as sex
    ) 
    
-- 2: 实现拉链
select  *
from (--全量数据集: 修改历史数据的截至时间
    select A.uid,A.phone,A.sex,A.start_time,current_date() as end_time
    from  user_1 A
    left join user_2  B on A.uid=B.uid
    ) C
union all -- all_data=全量数据集+增量数据集
select --增量数据集:给最新数据集加上start_time,end_time
    D.*,current_date() as start_time,'9999-12-30' as end_time from  user_2 D

三 拉链表实现需要准备的两张表

表1:全量数据
表2:增量数据

四 结合我司环境发现的技术难点

1:如何获取增量数据?
1.1:思路一:根据时间子段,增量同步-(我们很多表是没有数据跟新时间字段的)
1.2:思路二:监控日志??(难度会比较大,需要入侵数据库日志,开发的工作量也会大)
1.3:思路三:获取每天获得一份切偏数据,然后用两天的切片数据去对比,就能找出最新的变更。
1.3.1:对比方式1: Except方式:但是需要HIVE2.3.0才支持,我们环境的HIVE是1.1.0
1.3.2:对比方式2: concat+MD5

五 通过 concat+MD5 找出变更数据

with user_1 as (select -- 2020-04-23的切片数据
		    'zhangshan' as uid,123456 as phone, '1' as sex 
		    ),
		    user_2 as (select   -- 2020-04-22的切片数据
		    'zhangshan' as uid,123456 as phone, '0' as sex
		    ) 
-- 对边两天的切片数据,找出数据的变化点
	select A.uid,A.all_filed,B.all_filed  
	from(--     
	    select
	        uid,concat(uid,phone,sex) --拼接需要对比的字段
	        as all_filed,
	        md5(concat(uid,phone,sex)) as f1 
	    from user_1
	    )A
	left join (
	    select uid,concat(uid,phone,sex) as all_filed,md5(concat(uid,phone,sex)) as f1 from user_2
	    )B 
	on A.uid=B.uid
	where A.f1<>B.f1