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