拉链表设计详解

本文详细阐述了拉链表的设计原理,包括如何通过左连接和UNION操作整合每日增量数据。在设计过程中,首先创建并导入数据,然后进行数据查询、左连接和增量数据的融合,最终将结果更新到拉链表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拉链表设计原理

①.将拉链表和每日增量数据做左连接
每日增量没有匹配的数据和拉链表endtime<99991231的数据保持不变,
其他的endtime变为每日增量的starttime  1),如果数据发生修改,
拉链表和增量数据左连接,将拉链表的endtime修改为增量表starttime1,
(左连接匹配上的数据说明数据有变动,
但是拉链表endtime<99991231说明已经是历史状态,不需要改变)。
②.将每日增量数据和①结果进行union

设计过程

①.表创建以及数据导入
CREATE TABLE zipper( --拉链表
  	 userid VARCHAR(20),
 	 phone VARCHAR(20),
 	 nick VARCHAR(20),
  	 gender VARCHAR(20),
 	 addr VARCHAR(20),
 	 starttime DATE,
	 endtime DATE
 ) row format delimited fields terminated by '\t';
CREATE TABLE zipper_update( --每日增量数据
 	 userid VARCHAR(20),
	 phone VARCHAR(20),
 	 nick VARCHAR(20),
 	 gender VARCHAR(20),
 	 addr VARCHAR(20),
  	 starttime DATE,
  	 endtime DATE
) row format delimited fields terminated by '\t';
create table tmp_zipper(
	 userid string,
	 phone string,
	 nick string,
	 gender string,
	 addr string,
	 starttime string,
	 endtime string
) row format delimited fields terminated by '\t';
②.数据导入到表中
load data local inpath '/hivedata/zipper.txt' into table zipper;
load data local inpath '/hivedata/update.txt' into table zipper_update;
③.数据查询
SELECT * FROM zipper; --拉链表数据

在这里插入图片描述

select * from zipper_update;  --每日增量数据

在这里插入图片描述

④.将拉链表和每日增量数据做左连接
拉链表和增量表左关联数据
SELECT * 
  FROM zipper a 
  LEFT JOIN zipper_update b ON a.userid = b.userid;
结果查询

在这里插入图片描述
将拉链表和增量左关联,关联条件匹配上说明数据已经修改,同时判断拉链表endtime,如果小于9999-12-31说明已经是历史状态数据不做修改(将on关联条件匹配和拉链表endtime !< 9999-12-31)同时满足的数据(拉链表endtime)修改为增量表starttime - 1(第二天同步前一天数据)

select 
	  a.userid
	  ,a.phone
	  ,a.nick
	  ,a.gender
	  ,a.addr
	  ,a.starttime
	  ,if(b.userid is null or a.endtime < '9999-12-31',a.endtime,date_sub(b.starttime,1)) as endtime
  from zipper a
  left join zipper_update b on a.userid = b. userid;
结果查询

在这里插入图片描述

⑤.将上述结果和增量数据union all
INSERT overwrite tmp_zipper
SELECT
  		userid
  		,phone
  		,nick
  		,gender
  		,addr
  		,starttime
  		,endtime
  FROM  zipper_update

 UNION ALL 

select 
		a.userid
		,a.phone
		,a.nick
		,a.gender
		,a.addr
		,a.starttime
		,if(b.userid is null or a.endtime < '9999-12-31',a.endtime,date_sub(b.starttime,1)) as endtime
  from  zipper a
  left  join zipper_update b on a.userid = b. userid;
结果查询

在这里插入图片描述
最后将临时表数据INSERT overwrite 到拉链表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值