你真的了解全量表,增量表及拉链表吗?

1

Mysql数据准备css


第一天 9月10号数据mysql

1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:112,待支付,2020-09-10 14:20:11,2020-09-10 14:20:113,待支付,2020-09-10 16:20:11,2020-09-10 16:20:11


次日 9月11号数据
web

1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:112,已支付,2020-09-10 14:20:11,2020-09-11 14:21:113,已支付,2020-09-10 16:20:11,2020-09-11 16:21:114,待支付,2020-09-11 12:20:11,2020-09-11 12:20:115,待支付,2020-09-11 14:20:11,2020-09-11 14:20:11


对比mysql第一天和次日的数据发现,次日新增了订单id为4和5这两条数据,而且订单id为2和3的状态更新为了已支付
面试


2

全量表sql


天天的全部的最新状态的数据。微信

一、全量表,有无变化,都要报架构

二、每次上报的数据都是全部的数据(变化的 + 没有变化的)app


9月10号全量抽取到ods层
编辑器

create table wedw_ods.order_info_20200910( order_id     string    COMMENT '订单id',order_status string    COMMENT '订单状态',create_time  timestamp COMMENT '建立时间',update_time  timestamp COMMENT '更新时间') COMMENT '订单表'row format delimited fields terminated by ',';


create table wedw_dwd.order_info_df( order_id     string    COMMENT '订单id',order_status string    COMMENT '订单状态',create_time  timestamp COMMENT '建立时间',update_time  timestamp COMMENT '更新时间') COMMENT '订单表'partitioned by (date_id string)row format delimited fields terminated by ',';
# 把wedw_ods.order_info_20200910数据全量插到dwd层2020-09-10分区insert overwrite table wedw_dwd.order_info_df partition(date_id = '2020-09-10')selectorder_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200910;


9月11号全量抽取到ods层oop

create table wedw_ods.order_info_20200911( order_id     string    COMMENT '订单id',order_status string    COMMENT '订单状态',create_time  timestamp COMMENT '建立时间',update_time  timestamp COMMENT '更新时间') COMMENT '订单表'row format delimited fields terminated by ',';

# 把wedw_ods.order_info_20200911数据全量插到dwd层2020-09-11分区insert overwrite table wedw_dwd.order_info_df partition(date_id = '2020-09-11')selectorder_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200911;


全量抽取,每一个分区保留历史全量快照。


3

增量表


增量表:新增数据,增量数据是上次导出以后的新数据。

一、记录每次增长的量,而不是总量;

二、增量表,只报变化量,无变化不用报

三、业务库表中需有主键及建立时间,修改时间


9月10号全量抽取到ods层(全量初始化)

# 把wedw_ods.order_info_20200910数据全量插到dwd层2020-09-10分区insert overwrite table wedw_dwd.order_info_di partition(date_id = '2020-09-10')selectorder_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200910;


9月11号抽取更新的数据及当天新增的数据,即订单id为2,3,4,5的数据

wedw_dwd.order_info_di表9月10号的分区数据与wedw_ods.order_info_20200911增量抽取的数据合并,有2种方案


a.两个表经过主键关联,dwd表存在而且ods表不存在的数据

union all 一下wedw_ods.order_info_20200911表全部的数据,即全量数据插入到dwd表的9月11号的分区

insert overwrite table wedw_dwd.order_info_di partition(date_id = '2020-09-11')select t1.order_id,t1.order_status,t1.create_time,t1.update_timefromwedw_dwd.order_info_di t1left joinwedw_ods.order_info_20200911 t2on t1.order_id = t2.order_idwhere t1.date_id = '2020-09-10'and t2.order_id is nullunion allselect  order_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200911;


b.两个表数据union all一下,再根据order_id去重(根据order分组,更新时间降序,取第一条)

insert overwrite table wedw_dwd.order_info_di partition(date_id = '2020-09-11')select t2.order_id,t2.order_status,t2.create_time,t2.update_time from(    select     t1.order_id    ,t1.order_status    ,t1.create_time    ,t1.update_time    ,row_number() over(partition by order_id order by update_time desc) as rn    from    (        select         order_id        ,order_status        ,create_time        ,update_time        from        wedw_dwd.order_info_di         where date_id = '2020-09-10'         union all         select          order_id        ,order_status        ,create_time        ,update_time        from         wedw_ods.order_info_20200911    ) t1) t2where t2.rn = 1;


特殊增量表:da表,天天的分区就是当天的数据,其数据特色就是数据产生后就不会发生变化,如日志表。


4

拉链表


维护历史状态,以及最新状态数据

适用状况:

1.数据量比较大

2.表中的部分字段会被更新

3.须要查看某一个时间点或者时间段的历史快照信息

    查看某一个订单在历史某一个时间点的状态

    某一个用户在过去某一段时间,下单次数

4.更新的比例和频率不是很大

    若是表中信息变化不是很大,天天都保留一份全量,那么每次全量中会保存不少不变的信息,对存储是极大的浪费

优势

一、知足反应数据的历史状态

二、最大程度节省存储


9月10号全量抽取到ods层

create table wedw_ods.order_info_20200910( order_id     string    COMMENT '订单id',order_status string    COMMENT '订单状态',create_time  timestamp COMMENT '建立时间',update_time  timestamp COMMENT '更新时间') COMMENT '订单表'row format delimited fields terminated by ',';


创建dwd层拉链表


增长两个字段:
start_dt(表示该条记录的生命周期开始时间——周期快照时的状态)
end_dt(该条记录的生命周期结束时间)

end_dt= ‘9999-12-31’ 表示该条记录目前处于有效状态


create table wedw_dwd.order_info_dz( order_id     string    COMMENT '订单id',order_status string    COMMENT '订单状态',create_time  timestamp COMMENT '建立时间',update_time  timestamp COMMENT '更新时间',start_dt     date      COMMENT '开始生效日期',end_dt       date      COMMENT '结束生效日期') COMMENT '订单表'partitioned by (date_id string)row format delimited fields terminated by ',';

注:第一次加工的时候须要初始化全部数据,start_time设置为数据日期2020-09-10 ,end_time设置为9999-12-31

insert overwrite table wedw_dwd.order_info_dz partition(date_id = '2020-09-10')select order_id    ,order_status,create_time ,update_time ,to_date(update_time) as start_dt   ,'9999-12-31' as end_dt  fromwedw_ods.order_info_20200910;


9月11号抽取更新的数据及当天新增的数据到ods层,即订单id为2,3,4,5的数据


insert overwrite table wedw_dwd.order_info_dz partition(date_id = '2020-09-11')select t1.order_id    ,t1.order_status,t1.create_time ,t1.update_time,t1.start_dt,case when t1.end_dt = '9999-12-31' and t2.order_id is not null then t1.date_id else t1.end_dt end as end_dtfromwedw_dwd.order_info_dz t1left join wedw_ods.order_info_20200911 t2on t1.order_id = t2.order_idwhere t1.date_id = '2020-09-10'union allSELECT t1.order_id    ,t1.order_status,t1.create_time ,t1.update_time,to_date(update_time) as start_dt,'9999-12-31' as end_dtFROM wedw_ods.order_info_20200911 t1;


查询当前的全部有效记录:

select * from wedw_dwd.order_info_dz where date_id = '2020-09-11'and end_dt ='9999-12-31';


查询9月10号历史快照:

select * from wedw_dwd.order_info_dz where date_id = '2020-09-10' and start_dt <= '2020-09-10' and end_dt >='2020-09-10';


查询9月11号历史快照:

select * from wedw_dwd.order_info_dz where date_id = '2020-09-11' and start_dt <= '2020-09-11' and end_dt >='2020-09-11';


5

总结


不知道以上的一些例子你们有没有看明白呢?

在工做中,其实上述3种表都是颇有可能会用到的,那么咱们应该怎么选择呢?

  • 若是数据量不是很大(不超过20W)且预估后续增加的很是慢,能够考虑全量表抽取,这是最简便的方法

  • 若是数据量目前来讲不是很大,可是业务发展很快,数据量一段时间后就会上来,建议增量抽取哦

  • 目前数据量自己就很是大,确定是须要增量抽取的,好比如今有10亿数据,若是你天天全量抽取一遍,相信我,你会抽哭的

  • 对于历史状态须要保存的,这个时候就须要使用拉链表了,实际工做中,使用拉链表的场景并不会太多,好比订单表,保存订单历史状态,维表(缓慢变化维的处理)


2020大数据面试题真题总结(附答案)

微信交流群

缓慢变化维(SCD)常看法决方案

全方位解读星型模型,雪花模型及星座模型

Sqoop or Datax

left join(on&where)

ID-Mapping

大家公司还在用SparkOnYan吗?

大厂高频面试题-连续登陆问题

朋友面试数据研发岗遇到的面试题

数据仓库分层架构

clickhouse实践篇-SQL语法

clickhouse实践篇-表引擎

简单聊一聊大数据学习之路

朋友面试数据专家岗遇到的面试题

HADOOP快速入门

数仓工程师的利器-HIVE详解

Hive调优,每个数据工程师必备技能

OLAP引擎—Kylin介绍

Hbase从入门到入坑

Kafka

Datax-数据抽取同步利器

Spark数据倾斜解决方案

Spark统一内存管理机制

数据治理之数据质量管理

数据治理之元数据管理

数据仓库中的维表和事实表

知识点总结——数仓表一览





本文分享自微信公众号 - 大数据私房菜(datagogogo)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索