表概念
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';
)