拉链表相关练习

3 篇文章 2 订阅
2 篇文章 0 订阅

需求:在mysql数据库中有一个人员信息表(userinfo)

数据字段如下:
列名 类型 说明
user_id varchar(50) 用户编号
phone_number varchar(50) 手机号
health_code varchar(50) 健康码的颜色(绿色,黄色,红色)
reg_time varchar(50) 用户注册日期
modify_time varchar(50) 健康码颜色修改日期
在Mysql中的建表语句为:

– 创建数据库

create database if not exists exam;

– 创建人员表

create table if not exists exam.userinfo(
user_id varchar(50), – 人员编号
phone_number varchar(50), – 人员手机号
health_code varchar(50), – 健康码的颜色
reg_time varchar(50), – 用户注册日期
modify_time varchar(50) – 健康码颜色修改日期
);

2020年04月30日的数据如下:

user_id phone_number health_code reg_time modify_time
001 15953100001 绿色 2020-03-14 2020-04-30
002 15953100002 绿色 2020-03-14 2020-04-30
003 15953100003 黄色 2020-03-14 2020-04-30
004 15953100004 红色 2020-03-14 2020-04-30

插入语句:

insert into exam.userinfo(user_id, phone_number, health_code, reg_time,modify_time) values
(‘001’, ‘15953100001’, ‘绿色’, ‘2020-03-14’, ‘2020-04-30’),
(‘002’, ‘15953100002’, ‘绿色’, ‘2020-03-14’, ‘2020-04-30’),
(‘003’, ‘15953100003’, ‘黄色’, ‘2020-03-14’, ‘2020-04-30’),
(‘004’, ‘15953100004’, ‘红色’, ‘2020-03-14’, ‘2020-04-30’);

创建 hive_ods层 数据库

create database users;

创建 hive表

create table userinfo(
user_id string, – 人员编号
phone_number string, – 人员手机号
health_code string, – 健康码的颜色
reg_time string, – 用户注册日期
modify_time string – 健康码颜色修改日期
)partitioned by (dt string)
STORED AS PARQUET;

kettle导入全量数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建 dw 层

create database users_dw;

create table userinfo_dw(
user_id string, – 人员编号
phone_number string, – 人员手机号
health_code string, – 健康码的颜色
reg_time string, – 用户注册日期
modify_time string, – 健康码颜色修改日期
dw_start_date string,
dw_end_date string
)
STORED AS PARQUET;

导入全量数据到 dw层

insert overwrite table userinfo_dw
select user_id string, – 人员编号
phone_number string, – 人员手机号
health_code string, – 健康码的颜色
reg_time string, – 用户注册日期
modify_time string, – 健康码颜色修改日期
modify_time as dw_start_date, – 生效日期
‘9999-12-31’ as dw_end_date – 失效日期
from users.userinfo
where dt = ‘20200430’;

2020年05月01日的数据如下:

user_id phone_number health_code reg_time modify_time
001 15953100001 绿色 2020-03-14 2020-05-01
002 15953100002 绿色 2020-03-14 2020-05-01
003 15953100003 绿色 2020-03-14 2020-05-01
004 15953100004 黄色 2020-03-14 2020-05-01
005 15953100005 绿色 2020-05-01 2020-05-01

修改和添加的语句


UPDATE exam.userinfo SET health_code = ‘绿色’, modify_time = ‘2020-05-01’ WHERE user_id = ‘003’;
UPDATE exam.userinfo SET health_code = ‘黄色’, modify_time = ‘2020-05-01’ WHERE user_id = ‘004’;
INSERT INTO exam.userinfo(user_id, phone_number, health_code, reg_time,modify_time) VALUES
(‘005’, ‘15953100005’, ‘绿色’, ‘2020-05-01’, ‘2020-05-01’);

hive表创建0501分区

alter table users.userinfo add if not exists partition (dt=‘20200501’)

修复分区

msck repair table users.userinfo;

导入 0501 的 增量数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写SQL处理dw层历史数据,重新计算之前的dw_end_date

select t1.user_id, – 商品编号
t1.phone_number, – 商品状态
t1.health_code, – 商品创建时间
t1.reg_time,
t1.modify_time, – 商品修改时间
t1.dw_start_date, – 生效日期(生效日期无需重新计算)
case
when (t2.user_id is not null and t1.dw_end_date > ‘2020-05-01’)
then ‘2020-05-01’
else t1.dw_end_date – 小的是以前修改的,不用修改,只修改9999-12-31的数据
end as dw_end_date – 更新生效日期(需要重新计算)
from users_dw.userinfo_dw t1
left join
(select * from users.userinfo where dt = ‘20200501’) t2
on t1.user_id = t2.user_id;

合并当天最新的数据和历史数据到dw

insert overwrite table users_dw.userinfo_dw
select t1.user_id, – 商品编号
t1.phone_number, – 商品状态
t1.health_code, – 商品创建时间
t1.reg_time,
t1.modify_time, – 商品修改时间
t1.dw_start_date, – 生效日期(生效日期无需重新计算)
case
when (t2.user_id is not null and t1.dw_end_date > ‘2020-05-01’)
then ‘2020-05-01’
else t1.dw_end_date
end as dw_end_date – 更新生效日期(需要重新计算)
from users_dw.userinfo_dw t1
left join
(select * from users.userinfo where dt = ‘20200501’) t2
on t1.user_id = t2.user_id
union all
select userinfo.user_id, – 商品编号
userinfo.phone_number, – 商品状态
userinfo.health_code, – 商品创建时间
userinfo.reg_time,
userinfo.modify_time, – 商品修改时间
userinfo.modify_time as dw_start_date, – 生效日期
‘9999-12-31’ as dw_end_date – 失效日期
from users.userinfo
where dt = ‘20200501’ – 只有新增和修改的数据
order by dw_start_date, user_id;

最后结果:

在这里插入图片描述

2020年05月02日的数据如下:

user_id phone_number health_code reg_time modify_time
001 15953100001 绿色 2020-03-14 2020-05-01
002 15953100002 绿色 2020-03-14 2020-05-01
003 15953100003 绿色 2020-03-14 2020-05-01
004 15953100004 绿色 2020-03-14 2020-05-02
005 15953100005 黄色 2020-05-01 2020-05-02
006 15953100006 红色 2020-05-02 2020-05-02

修改和添加语句:

UPDATE exam.userinfo SET health_code = ‘绿色’, modify_time = ‘2020-05-02’ WHERE user_id = ‘004’;
UPDATE exam.userinfo SET health_code = ‘黄色’, modify_time = ‘2020-05-02’ WHERE user_id = ‘005’;
INSERT INTO exam.userinfo(user_id, phone_number, health_code, reg_time,modify_time) VALUES
(‘006’, ‘15953100006’, ‘绿色’, ‘2020-05-02’, ‘2020-05-02’);

创建0502分区

alter table users.userinfo add if not exists partition (dt=‘20200502’)

修复分区

msck repair table users.userinfo;

导入0502的增量数据

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更新数据覆盖dw层

insert overwrite table users_dw.userinfo_dw
select t1.user_id, – 商品编号
t1.phone_number, – 商品状态
t1.health_code, – 商品创建时间
t1.reg_time,
t1.modify_time, – 商品修改时间
t1.dw_start_date, – 生效日期(生效日期无需重新计算)
case
when (t2.user_id is not null and t1.dw_end_date > ‘2020-05-02’)
then ‘2020-05-02’
else t1.dw_end_date – 小的是以前修改的,不用修改,只修改9999-12-31的数据
end as dw_end_date – 更新生效日期(需要重新计算)
from users_dw.userinfo_dw t1
left join
(select * from users.userinfo where dt = ‘20200502’) t2
on t1.user_id = t2.user_id
union all
select userinfo.user_id, – 商品编号
userinfo.phone_number, – 商品状态
userinfo.health_code, – 商品创建时间
userinfo.reg_time,
userinfo.modify_time, – 商品修改时间
userinfo.modify_time as dw_start_date, – 生效日期
‘9999-12-31’ as dw_end_date – 失效日期
from users.userinfo
where dt = ‘20200502’ – 只有新增和修改的数据
order by dw_start_date, user_id;

最后结果:

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值