拉链表在实际工作中还是有使用的必要,能够大量的节省存储空间,我这次主要使用在商户信息构建,商户姓名存在改名字的可能性,但是商户id不变,下面是一个商户信息表做拉链表的例子。
主要构建思路:1、首先,找到记录最早一天的商户信息作为初始状态,写入到最后使用的表中
2、然后把改名字的商户的结束日期修改下 + 每日新增的商户信息 + 改名字之后新的商户信息一起覆盖掉原表
思考:数据的更新还是比较麻烦的,如果我存了100天的商户信息数据,只能脚本跑上100次,且不能并行,且不好出错重试。在ods还是保留每日原始数据稳妥点,后面重刷数据有保障,所以在实际中盲猜使用并不广泛。
--建表语句
CREATE TABLE `dim_trd_shop_info_new` (
`id` bigint COMMENT '自增id',
`name` string COMMENT '商户名称',
`owner_name` string COMMENT '所有者名称',
`shop_category_id` bigint COMMENT '商户类目id',
`other_category` string COMMENT '外站店铺栏目',
`link` string,
`business` string,
`loaction_1` string,
`hupu_uid` bigint,
`charge` double COMMENT '佣金',
`status` bigint COMMENT '0',
`position` bigint COMMENT '1~+∞ 数字越大,排序越低',
`verify_status` bigint COMMENT '是否认证: 0,不认证 1,认证',
`collect_count` bigint COMMENT '收藏数',
`shop_user_id` bigint COMMENT '淘宝用户id',
`shop_info` string COMMENT '淘宝店铺信息',
`shop_shop_id` bigint COMMENT '店铺shopid',
`num_and_praise` string COMMENT '店铺商品数及好评率',
`is_delete` bigint COMMENT '是否已删除',
`created_at` datetime COMMENT '创建时间',
`updated_at` datetime COMMENT '更新时间',
`shop_id` string COMMENT '规整化shopid',
`store` string COMMENT '商城',
`refuse` string COMMENT '拒绝理由',
`quality_status` bigint COMMENT '是否精品店铺 1是 0 否',
`is_officail` bigint COMMENT '是否官方 1是 0 否',
`is_freepost` bigint COMMENT '是否包邮 1是 0 否',
`certification` string COMMENT '证书',
`sales` double COMMENT '店铺销量',
`sales_index` double COMMENT '销售指数',
`coupon` string COMMENT '优惠券',
`update_time` datetime COMMENT '更新时间',
`update_info` string COMMENT '更新信息',
`crawl_attr` string COMMENT '抓取店铺商品标识',
`sales_revise` double COMMENT '指数修正值',
`shop_name` string COMMENT '店铺名',
`fee_link` string COMMENT '佣金链接',
`official_name` string COMMENT '官方店铺名',
`shop_charge_time` datetime COMMENT '佣金保护结束时间',
begin_date bigint COMMENT '当前状态开始时间',
end_date bigint COMMENT '当前状态结束时间'
)
COMMENT '商户表';
--先把最早存储的日期的数据写进来
insert overwrite table dim_trd_shop_info_new
select id
,name
,owner_name
,shop_category_id
,other_category
,link
,business
,loaction_1
,hupu_uid
,charge
,status
,position
,verify_status
,collect_count
,shop_user_id
,shop_info
,shop_shop_id
,num_and_praise
,is_delete
,created_at
,updated_at
,shop_id
,case when shop_category_id = 4 then '京东'
when shop_category_id = 3 then '淘宝'
when shop_category_id = 2 then '天猫'
else '其他' end as store
,refuse
,quality_status
,is_officail
,is_freePost
,certification
,sales
,sales_index
,coupon
,update_time
,update_info
,crawl_attr
,sales_revise
,shop_name
,fee_link
,official_name
,shop_charge_time
,20190331 as begin_date
,99991231 as end_date
from ods_trd_shop_info
where dt = 20190331
;
--再记录改变名字的商户
--1、先把原记录的结束日期修改下
--2、再把新纪录写进去,同时加上了修改名字的商户的记录
insert overwrite table dim_trd_shop_info_new
select id
,t1.name
,owner_name
,shop_category_id
,other_category
,link
,business
,loaction_1
,hupu_uid
,charge
,status
,position
,verify_status
,collect_count
,shop_user_id
,shop_info
,shop_shop_id
,num_and_praise
,is_delete
,created_at
,updated_at
,t1.shop_id
,store
,refuse
,quality_status
,is_officail
,is_freePost
,certification
,sales
,sales_index
,coupon
,update_time
,update_info
,crawl_attr
,sales_revise
,t1.shop_name
,fee_link
,official_name
,shop_charge_time
,begin_date
,if(t1.name <> t2.name,${bdp.system.bizdate},end_date) as end_date --如果商户名称不相等,说明商户名称有变更,结束日期修改下
from (
select *
from dim_trd_shop_info_new
) t1
left join
(
select shop_id
,name
from ods_trd_shop_info
where dt = ${bdp.system.bizdate}
) t2
on t1.shop_id = t2.shop_id
union all
select id
,t1.name
,owner_name
,shop_category_id
,other_category
,link
,business
,loaction_1
,hupu_uid
,charge
,status
,position
,verify_status
,collect_count
,shop_user_id
,shop_info
,shop_shop_id
,num_and_praise
,is_delete
,created_at
,updated_at
,t1.shop_id
,case when shop_category_id = 4 then '京东'
when shop_category_id = 3 then '淘宝'
when shop_category_id = 2 then '天猫'
else '其他' end as store
,refuse
,quality_status
,is_officail
,is_freePost
,certification
,sales
,sales_index
,coupon
,update_time
,update_info
,crawl_attr
,sales_revise
,t1.shop_name
,fee_link
,official_name
,shop_charge_time
,${bdp.system.bizdate} as begin_date --如果商户名称不相等,说明商户名称有变更,开始日期修改下
,99991231 as end_date
from (
select *
from ods_trd_shop_info
where dt = ${bdp.system.bizdate}
) t1
left join
(
select shop_id
,name
from dim_trd_shop_info_new
) t2
on t1.shop_id = t2.shop_id
where t1.name <> t2.name --这个条件是找到改名字商户
or t2.shop_id is null --这个条件是找到新增的商户
;