day 11 拉链

--加载算法--

--全量覆盖
hive的写法是
insert overnrite table 表名

--sql 的写法是
select
字段名称 as 字段名称新
from 表名

增量追加
先删除p层里面的数据
delete from 表名 where 条件
inse into 表明
select * from 表名2 s层的表


拉链是记录记录某个数据在某一时间段的状态

例如:
id money date
mo 1000w 20180604
mo 500w 20180605

id money start_date end_date
mo 1000w 20180601 30000102 一开始的状态


mo 1000w 20180601 20180605 进入银行记录状态,不知道这个钱的来历
mo 500w 20180601 20180610 6月5号消费花掉500w还剩500w记录在银行的状态
mo 0 20180610 30000102 6月10号又花掉了500w,所以上面的end_date日期记录为最新消费的日期



数据三种状态
p层里面没有 s层里面是新增的
p层里面有 s层里面也有 数据发生变化了这叫更新
p层里面有 s层里面也有 数据是原有的且没有变化
drop table sdata.dbo.mo_money
create table sdata.dbo.mo_money
(
name varchar(255)
,money float
,date_stamp date
)


拉链表
drop table pdata.dbo.mo_money_history
create table pdata.dbo.mo_money_history
(
name varchar(255)
,money float
, start_date date
,end_date date
)


往s层插入一条数据

insert into sdata.dbo.mo_money
values('mo','1000','2018-06-01')
insert into sdata.dbo.mo_money
values('jerry','11000','2018-05-01')
select * from sdata.dbo.mo_money

将数据分为三种状态 一定要去重sdata.dbo.mo_money里面的数据是一条但是
pdata.dbo.mo_money_history里面mo 的数据是两条造1对2 的情况
drop table sdata.dbo.mo_money_falg
select
distinct
a.*
,case when b.name is null then 1 --新增--
when b.name IS not null and a.money <> b.money then 2 --更新--
when b.name IS not null and a.money = b.money then 3 --不变--
end flag
into sdata.dbo.mo_money_falg
from sdata.dbo.mo_money a
left join pdata.dbo.mo_money_history b
on a.name = b.name
select * from sdata.dbo.mo_money_falg

将新增数据插入到p层
insert into pdata.dbo.mo_money_history
select
a.name
,a.money
,a.date_stamp
,'3000-01-01' --结束时间
from
sdata.dbo.mo_money a
inner join
sdata.dbo.mo_money_falg b
on a.name = b.name
where b.flag = 1
select* from pdata.dbo.mo_money_history


新增数据形成闭连
往在s层插入一条数据
delete from sdata.dbo.mo_money 删除这个表里面的数据
insert into sdata.dbo.mo_money
values('mo','0','2018-06-08')
insert into sdata.dbo.mo_money
values('jerry','5','2018-05-20')
select * from sdata.dbo.mo_money

将数据分为三种状态
drop table sdata.dbo.mo_money_falg
select a.*
,case when b.name is null then 1
when b.name IS not null and a.money <> b.money then 2
when b.name IS not null and a.money = b.money then 3
end flag
into sdata.dbo.mo_money_falg
from sdata.dbo.mo_money a
left join pdata.dbo.mo_money_history b --p层的数据--
on a.name = b.name
select * from sdata.dbo.mo_money_falg


将新增数据插入到p层 进行闭连update
update pdata.dbo.mo_money_history
set end_date=b.date_stamp
from pdata.dbo.mo_money_history
inner join
sdata.dbo.mo_money_falg b
on pdata.dbo.mo_money_history.name = b.name
where b.flag = 2 and pdata.dbo.mo_money_history.end_date='3000-01-01'
select* from pdata.dbo.mo_money_history

插入数据
insert into pdata.dbo.mo_money_history
select
name
,money
,b.date_stamp
,'3000-01-01'
from sdata.dbo.mo_money_falg b
where b.flag = 2

select * from pdata.dbo.mo_money_history

原文地址:https://www.cnblogs.com/simly/p/9498356.html