数据仓库之拉链表实现

拉链表在实际工作中还是有使用的必要,能够大量的节省存储空间,我这次主要使用在商户信息构建,商户姓名存在改名字的可能性,但是商户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            --这个条件是找到新增的商户
;







 

你可能感兴趣的:(hive,数据仓库)