前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >历史拉链表「建议收藏」

历史拉链表「建议收藏」

作者头像
全栈程序员站长
发布2022-11-02 09:57:52
2690
发布2022-11-02 09:57:52
举报
文章被收录于专栏:全栈程序员必看

使用UDW创建历史拉链表。

介绍

  • 历史拉链表
    • 历史拉链表是一种数据模型,主要针对数据仓库设计中表存储数据的方式而定义的。**它记录一个事物从开始到当前状态的所有变化的信息。**拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。
    • 也就是说,对于表中的任何数据,不进行真正的删除,只记录操作和有效日期。
  • 流程
    55253131334
    55253131334
    • 其中,tmp0表有两个分区,表示历史数据和当前数据,使用tmp1tmp0和事实表进行更新和交换。

操作

创建表

首先需要创建delta表,事实表,以及两个tmp表

代码语言:javascript
复制
-- 事实表
create table public.member_fatdt0
(
member_id varchar(64),         -- 会员ID
phoneno varchar(20),           -- 电话号码
dw_beg_date date,              -- 生效日期
dw_end_date date,              -- 失效日期
dtype char(1),                 -- 类型(历史数据,当前数据)
dw_status char(1),             -- 数据操作类型(I,D,U)
dw_ins_date date               -- 数据仓库插入日期
)with(appendonly=true,compresslevel=5)   -- 压缩级别
distributed by (member_id)
PARTITION BY RANGE (dw_end_date)
(
PARTITION p20111201 START (date '2011-12-01') INCLUSIVE,
PARTITION p20111202 START (date '2011-12-02') INCLUSIVE,
PARTITION p20111203 START (date '2011-12-03') INCLUSIVE,
PARTITION p20111204 START (date '2011-12-04') INCLUSIVE,
PARTITION p20111205 START (date '2011-12-05') INCLUSIVE,
PARTITION p20111206 START (date '2011-12-06') INCLUSIVE,
PARTITION p20111207 START (date '2011-12-07') INCLUSIVE,
PARTITION p20111231 START (date '2011-12-31') INCLUSIVE
END (date '3001-01-01') EXCLUSIVE
);
-- 增量表
create table public.member_delta
(
member_id varchar(64),
phoneno varchar(20),
action char(1),                      -- 数据操作类型(I,D,U)
dw_ins_date date                     -- 类型(新增,删除,更新)
)with(appendonly=true,compresslevel=5)   -- 压缩级别
distributed by (member_id)
-- 临时表
create table public.member_tmp0
(
member_id varchar(64),
phoneno varchar(20),
dw_beg_date date,
dw_end_date date,
dtype char(1),
dw_status char(1),
dw_ins_date date
)with(appendonly=true,compresslevel=5)   -- 压缩级别
distributed by (member_id)
PARTITION BY LIST (dtype)
(
PARTITION PHIS VALUES ('H'),      -- 表示历史信息
PARTITION PCUR VALUES ('C'),      -- 表示当前信息
DEFAULT PARTITION other
);

– 临时表1 create table public.member_tmp1 ( member_id varchar(64), phoneno varchar(20), dw_beg_date date, dw_end_date date, dtype char(1), dw_status char(1), dw_ins_date date )with(appendonly=true,compresslevel=5) – 压缩级别 distributed by (member_id)

代码语言:javascript
复制
55252699017
55252699017

插入数据

插入delta表

代码语言:javascript
复制
Insert into member_delta values('mem006','1310000006','I','2011-12-03');
Insert into member_delta values('mem002','1310000002','D','2011-12-03');
Insert into member_delta values('mem003','1310000003','U','2011-12-03');
代码语言:javascript
复制
- ![55252708610](http://wx4.sinaimg.cn/mw690/0060lm7Tly1g124h8xtgtj30al02w0sk.jpg)

插入事实表

代码语言:javascript
复制
Insert into member_fatdt0 values('mem001','1310000001','2011-12-01','3000-12-31','C','I','2011-12-02');
Insert into member_fatdt0 values('mem002','1310000002','2011-12-01','3000-12-31','C','I','2011-12-02');
Insert into member_fatdt0 values('mem003','1310000003','2011-12-01','3000-12-31','C','I','2011-12-02');
Insert into member_fatdt0 values('mem004','1310000004','2011-12-01','3000-12-31','C','I','2011-12-02');
Insert into member_fatdt0 values('mem004','1310000004','2011-12-01','3000-12-31','C','I','2011-12-02');
Insert into member_fatdt0 values('mem005','1310000005','2011-12-01','3000-12-31','C','I','2011-12-02');
55252707255
55252707255

数据刷新

将member_fatdt0表与member_delta左外连接,相关联的历史数据插入到member_tmp0历史分区,反之插入到member_tmp0的当前分区

这里主要处理update和delete操作,若能进行左连接,说明数据有更新,插入历史分区

代码语言:javascript
复制
truncate table public.member_tmp0;
-- 清理临时表
insert into public.member_tmp0
(
member_id,
phoneno,
dw_beg_date,
dw_end_date,
dtype,
dw_status,
dw_ins_date
)
select a.member_id,a.phoneno,a.dw_beg_date,
case when b.member_id is null then a.dw_end_date
else date '2011-12-02'
end as dw_end_date,
case when b.member_id is null then 'C'
else 'H'
end as dtype,
case when b.member_id is null then a.dw_status
else b.action
end as dw_status,
date '2011-12-03'
from public.member_fatdt0 a
left join public.member_delta b 
on a.member_id = b.member_id
and b.action in('D','U')
where a.dw_beg_date <= cast('2011-12-02' as date) -1
and a.dw_end_date > cast('2011-12-02' as date)-1;
55252723553
55252723553

将member_delta当前数据(更新,插入的新数据)插入到member_tmp0当前分区,end时间为无穷。

代码语言:javascript
复制
insert into public.member_tmp0
(
member_id,
phoneno,
dw_beg_date,
dw_end_date,
dtype,
dw_status,
dw_ins_date
)
select member_id,phoneno,
cast('2011-12-02' as date),
cast('3000-12-31' as date),
'C',
action,
cast('2011-12-03' as date)
from public.member_delta
where action in ('I','U');
55252858777
55252858777

将member_tmp0历史数据与member_fatdt0相应分区交换(通过member_tmp1表进行交换)。

代码语言:javascript
复制
alter table  member_tmp1 drop constraint member_tmp0_1_prt_phis_check;
truncate table public.member_tmp1;
alter table public.member_tmp0 exchange partition for ('H') with table public.member_tmp1;
alter table public.member_fatdt0 exchange partition for('2011-12-02') with table public.member_tmp1;
55252886260
55252886260

将member_tmp0当前数据与member_fatdt0相应分区交换(通过member_tmp1表进行交换)。

代码语言:javascript
复制
alter table  member_tmp1 drop constraint member_fatdt0_1_prt_p20111202_check
alter table  member_tmp1 drop constraint member_tmp0_1_prt_pcur_check
alter table public.member_tmp0 exchange partition for('C') with table public.member_tmp1;
alter table public.member_fatdt0 exchange partition for('3000-12-31') with table public.member_tmp1;
55252945525
55252945525

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181068.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 操作
    • 创建表
      • 插入数据
        • 数据刷新
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档