地址信息拉链表的使用介绍和设计

地址信息拉链表的使用介绍和设计

• 一、拉链表的介绍
o 1)拉链表定义:
o 2)地址信息拉链表:
o 3)地址信息拉链表的使用缘由
o 4)拉链表数据示例
• 二、拉链表的使用:
o 1)查询有效数据
o 2)查询历史快照数据
• 三、表字段
• 四、地址信息拉链表的设计
o 1)拉链表设计之数据演示
o 2)建表SQL
一、拉链表的介绍
表名:dm_gis.addr_info
1)拉链表定义:
拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的生命周期。
2)地址信息拉链表:
该表的地址取自运单宽表,调用rds容灾服务,存储相应的字段信息,使用的时候通过citycode和address进行唯一性关联
存储的是地址的基本信息,如省、城市代码、网点、单元区域、经纬度等信息及每条记录的一段周期内的快照信息,当我们使用的时候,可以拿到这张表当天的最新数据以及之前的历史数据,该表保存的是最近三个月的快照数据。 使用该表需要注意开始和结束日期的条件过滤。
3)地址信息拉链表的使用缘由
1、由于经常要获取地址的网点和单元区域等信息,所以大家在使用的时候重复跑rds容灾环境,导致容灾环境压力过大,因此需要一个中间表存储这些信息,即地址信息每日更新表。
2、该表的数据源来源于运单宽表,而运单宽表是每日更新的,不同日期的地址会大量重复,如果仅仅只是取每日更新表,难以获取到较为全面的地址数据,并且需要取很多分区的数据排重后才能使用
3、设计的拉链表,既可以直接获取目前一段周期内所有地址的有效地址信息,也可以获取一段周期内所有地址该周期内的每日快照信息,同时数据不跨分区,数据量也不会太大,使用较为方便。
4)拉链表数据示例
该表主要用于离线数据关联地址的相关信息,原表字段较多,下图演示仅使用部分字段。
end_date为20991231表示是目前生效的地址,其他日期表示是历史快照信息
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231  
2 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191101 20191102  
3 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021S040 20191101 20191103
4 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191102 20191103
5 上海市上海市宝山区业绩路21号 022 021SS 021SS004 20191102 20991231  
6 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021M103 20191103 20991231
7 上海市上海市宝山区大场镇真华路999号水岸蓝桥66号楼1105室 021 021SG 021SG061 20191103 20991231
8 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021SKM312 20191103 20991231
二、拉链表的使用:
1)查询有效数据
查询有效地址的所有记录(end_date = '20991231' 表示在有效期,取值不可更改)
select * from dm_gis.addr_info where end_date = '20991231'
2)查询历史快照数据
查询地址20191102号的历史快照数据(注意:此处查询的start_date和end_date两个条件是必要的)
select * from user where start_date <= '20191102' and end_date >= '20191102'
三、表字段
dm_gis.addr_info
province string 省
citycode string 城市代码
address string 地址
src string 来源
zc string 网点
tc string 单元区域
aoiid string aoiid
aoicode string aoicode
key_word string 主体词
groupid string 大组id
id string 小组id
level string level
filter string filter
id_x string 小组地址经度
id_y string 小组地址纬度
standardization string 大组标准化地址
key string  
split_result string 切词
start_date string 开始日期
end_date string 结束日期,20991231表示在有效期,其他值表示是历史快照
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、地址信息拉链表的设计
1)拉链表设计之数据演示
20191101号表中的数据
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231 初始化数据
2 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191101 20991231 初始化数据
3 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021S040 20191101 20991231 初始化数据
20191102号拉链表中的数据
序号4和5是update表的新数据,其中4号数据在拉链表中已经存在(2号),因此把2号数据标为历史数据,即end_date更新为20191102,,该地址生效的为4号数据
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231  
2 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191101 20191102 end_date变化为历史数据
3 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021S040 20191101 20991231  
4 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191102 20991231 20191102号新增数据,历史中存在
5 上海市上海市宝山区业绩路21号 022 021SS 021SS004 20191102 20991231 20191102号新增数据,历史中不存在
20191103号拉链表中的数据
6 7 8 为update表新增的数据,而6和8对应的有历史记录,3 4,因此更新3 4的end_date
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231  
2 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191101 20191102  
3 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021S040 20191101 20191103 end_date变化为历史数据
4 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191102 20191103 end_date变化为历史数据
5 上海市上海市宝山区业绩路21号 022 021SS 021SS004 20191102 20991231  
6 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021M103 20191103 20991231 20191103号新增数据,历史中存在
7 上海市上海市宝山区大场镇真华路999号水岸蓝桥66号楼1105室 021 021SG 021SG061 20191103 20991231 20191103号新增数据,历史不存在
8 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021SKM312 20191103 20991231 20191103号新增数据,历史中存在
取有效地址数据,地址不会重复
select * from dm_gis.addr_info where end_date = '20991231'
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231  
5 上海市上海市宝山区业绩路21号 022 021SS 021SS004 20191102 20991231  
6 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021M103 20191103 20991231  
7 上海市上海市宝山区大场镇真华路999号水岸蓝桥66号楼1105室 021 021SG 021SG061 20191103 20991231  
8 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021SKM312 20191103 20991231  
取20191102号快照数据,地址不会重复
select * from user where start_date <= '20191102' and end_date >= '20191102'
no address citycode zc tc start_date end_date 备注
1 上海市上海市宝山区克东路50弄3号307 021 021SC 021SC021 20191101 20991231  
3 上海市上海市宝山区上海市辖区宝山区共江路通河八村184号103室 021 021S 021S040 20191101 20191103  
4 上海上海市松江区新桥镇九新公路2888号申新广场3号楼5楼 021 021LM 021LM008 20191102 20191103  
5 上海市上海市宝山区业绩路21号 022 021SS 021SS004 20191102 20991231  
2)建表SQL
-- 地址信息之每日更新表,分区表
(此数据由离线程序获取运单宽表数据源,调用rds容灾获取,每日定时更新)
create table if not exists dm_gis.addr_info_update(
province string comment '省',
citycode string comment '城市代码',
address string comment '地址',
src string comment '来源',
zc string comment '网点',
tc string comment '单元区域',
aoiid string comment 'aoiid',
aoicode string comment 'aoicode',
key_word string comment '主体词',
groupid string comment '大组id',
id string comment '小组id',
level string comment 'level',
filter string comment 'filter',
id_x string comment '小组地址经度',
id_y string comment '小组地址纬度',
standardization string comment'大组标准化地址',
key string comment '',
split_result string comment '切词'
)comment '地址信息之每日更新表' partitioned by (inc_day string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;
-- 地址信息拉链表,维护地址一个月的记录信息,非分区表
create table if not exists dm_gis.addr_info(
province string comment '省',
citycode string comment '城市代码',
address string comment '地址',
src string comment '来源',
zc string comment '网点',
tc string comment '单元区域',
aoiid string comment 'aoiid',
aoicode string comment 'aoicode',
key_word string comment '主体词',
groupid string comment '大组id',
id string comment '小组id',
level string comment 'level',
filter string comment 'filter',
id_x string comment '小组地址经度',
id_y string comment '小组地址纬度',
standardization string comment'大组标准化地址',
key string comment '',
split_result string comment '切词',
start_date string comment '开始日期',
end_date string comment '结束日期,20991231表示在有效期,其他值表示是历史快照'
)comment '地址信息之拉链表' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;
-- 初始化拉链表数据,使用update表20191102号数据
insert overwrite table dm_gis.addr_info
select c.province,c.citycode,c.address,c.src,c.zc,c.tc,c.aoiid,c.aoicode,c.key_word,
c.groupid,c.id,c.level,c.filter,c.id_x,c.id_y,c.standardization,c.key,c.split_result,
c.inc_day as start_date,
'20991231' as end_date
from dm_gis.addr_info_update c where inc_day='20191102' and address <> '' and citycode <> ''

-- 每日更新拉链表SQL,保留最近一个月的快照信息
set mapreduce.job.queuename=gis;
set hive.execution.engine = tez;
insert overwrite table dm_gis.addr_info
select * from
(
select a.province,a.citycode,a.address,a.src,a.zc,a.tc,a.aoiid,a.aoicode,a.key_word,
a.groupid,a.id,a.level,a.filter,a.id_x,a.id_y,a.standardization,a.key,a.split_result,
a.start_date,
case when a.end_date = '20991231' and b.address is not null then b.inc_day else a.end_date end as end_date
from
(select * from dm_gis.addr_info where start_date >= '20191003' and address is not null and address <> '' and citycode <> '') as a
left join
(select * from dm_gis.addr_info_update where inc_day='20191104' and address is not null and address <> '' and citycode <> '') as b
on a.address =b.address
union
select c.province,c.citycode,c.address,c.src,c.zc,c.tc,c.aoiid,c.aoicode,c.key_word,
c.groupid,c.id,c.level,c.filter,c.id_x,c.id_y,c.standardization,c.key,c.split_result,
c.inc_day as start_date,
'20991231' as end_date
from dm_gis.addr_info_update c where inc_day='20191104' and address is not null and address <> '' and citycode <> ''
)as t
-- 重跑数据
有时候碰到update表的数据有问题,此时update表直接删掉分区重新生成即可,而拉链表不是分区表,需要回退到操作之前的状态,然后再和update表最新一天数据join
重跑拉链表最新一次操作的数据,这里以20191104号数据举例
1)拉链表先回退到上一次操作的数据状态
insert overwrite table dm_gis.addr_info
select province,citycode,address,src,zc,tc,aoiid,aoicode,key_word,
groupid,id,level,filter,id_x,id_y,standardization,key,split_result,
start_date,
case when end_date ='20191104' and address is not null then '20991231' else end_date end as end_date
from dm_gis.addr_info where start_date <> '20191104'
2)执行上面每日更新拉链表的sql
--------------end--------------------

猜你喜欢

转载自www.cnblogs.com/david227/p/12408747.html