數倉ods分區總結

表概念

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'; 
    ) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章