1.全量表:用来记录当前所有事物的最新信息,包括变化的和没有变化的.
2.增量表:用来记录事务的有变化的量。只记录有变化的没有变化的不需要记录.
3.快照表:快照表是有时间分区的,每个分区里面的数据都是分区时间对应的前一天的所有全量数据.
4.拉链表: 记录一个事物从开始,一直到当前状态的所有变化的信息.
ods层新增数据插入到原表中,这样原表中会保存所有有过变化的历史数据,计算时需要将数据按照进入数仓的时间倒序取第一条(去重)做最新状态的计算。
ods层变化缓慢以及数据量小,按每天全量分区存储(快照表),另需要维护一张最新状态的全量表,计算取最新状态的全量表做计算。小文件多,后期数据量冗余存储量大,可定期将分区内数据压缩备份存储
例:ods_xxx ods_xxx_part_day
#快照表数据清洗
INSERT overwrite table ods_xxx_part_day partition(dw_day='${yesterday}')
SELECT
*
FROM source_xxx;
#全量表数据清洗
INSERT overwrite table ods_xxx
SELECT
*
FROM
ods_xxx_part_day
WHERE dw_day = '${yesterday}';
ods层增长速度快或者数据量大,增量数据按每天分区存储,另需要维护一张最新状态的全量表,将每天增量数据插入到一张全量表中,计算时需取全量表数据做最新状态的计算
例:ods_xxx ods_xxx__incr_part_day
#每日增量分区表数据清洗
#创建时需要将所有历史数据先清洗到一个分区中
INSERT overwrite table ods_xxx_incr_part_day partition(dw_day='${yesterday}')
SELECT
*
FROM source_xxx
WHERE update_time >='${yesterday} 00:00:00' and update_time <='${yesterday} 23:59:59' ;
#全量表数据清洗
INSERT overwrite table ods_xxx
SELECT
yt.*
FROM
ods_xxx AS yt
LEFT OUTER JOIN
(SELECT * FROM ods_xxx_incr_part_day WHERE dw_day = '${yesterday}') AS tt
ON yt.id = tt.id WHERE tt.id is null
UNION ALL
SELECT
*
FROM
ods_xxx_incr_part_day
WHERE dw_day = '${yesterday}';
拉链表中新增数据的生命周期字段开始和结束时间,初始化结束时间通常统一设定为某个最大时间段以便查询
每天全量数据的主键与前一天的全量数据的主键作比对,产生五部分的数据,新增的数据,删除的数据,修改前的数据,修改后的数据,不变的数据。
全量表建表:
CREATE TABLE `ods_xxx`(
id int COMMENT '',
.
.
.
dw_day string COMMENT '数据仓库日期')COMMENT ''
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'=',',
'serialization.format'=',',
'serialization.null.format'='')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
分区表建表:
CREATE TABLE `ods_xxx_part_day`(
id int COMMENT '',
.
.
)COMMENT ''
partitioned by (dw_day string COMMENT '分区日期')
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'field.delim'=',',
'serialization.format'=',',
'serialization.null.format'='')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
拉链表建表:
CREATE EXTERNAL TABLE dwd.user_his (
id int COMMENT '',
.
.
t_start_date COMMENT '',
t_end_date COMMENT '')
COMMENT '用户信息拉链表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '/dwd/user_his';
)