hive增量表和全量表_你需要了解的全量表,增量表及拉链表
mysql测试数据准备第一天 9月10号数据
1
2
31,待支付,2020-09-10 12:20:11,2020-09-10 12:20:11
2,待支付,2020-09-10 14:20:11,2020-09-10 14:20:11
3,待支付,2020-09-10 16:20:11,2020-09-10 16:20:11
第二天 9月11号数据
1
2
3
4
51,待支付,2020-09-10 12:20:11,2020-09-10 12:20:11
2,已支付,2020-09-10 14:20:11,2020-09-11 14:21:11
3,已支付,2020-09-10 16:20:11,2020-09-11 16:21:11
4,待支付,2020-09-11 12:20:11,2020-09-11 12:20:11
5,待支付,2020-09-11 14:20:11,2020-09-11 14:20:11
对比mysql第一天和第二天的数据发现,第二天新增了订单id为4和5这两条数据,并且订单id为2和3的状态更新为了已支付
全量表
每天所有的最新状态的数据,都要全量抽取到ods层,每个分区保留历史全量快照。
1、全量表,有无变化,都要报
2、每次上报的数据都是所有的数据(变化的 + 没有变化的)
9月10号全量抽取到ods层1
2
3
4
5
6
7
8create table 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 ','
;
1
2
3
4
5
6
7
8
9create table 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 ','
;
1
2
3
4
5
6
7
8# 把ods_order_info_20200910数据全量插到dwd层2020-09-10分区
insert overwrite table dwd_order_info_df partition(date_id = '2020-09-10')
select
order_id
,order_status
,create_time
,update_time
from ods_order_info_20200910;
9月11号全量抽取到ods层
1
2
3
4
5
6
7create table 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 ',';
1
2
3
4
5
6
7
8# 把ods_order_info_20200911数据全量插到dwd层2020-09-11分区
insert overwrite table dwd_order_info_df partition(date_id = '2020-09-11')
select
order_id
,order_status
,create_time
,update_time
from wedw_ods.order_info_20200911;
增量表
增量表:新增数据,增量数据是上次导出之后的新数据。
1、记录每次增加的量,而不是总量;
2、增量表,只报变化量,无变化不用报
3、业务库表中需有主键及创建时间,修改时间
9月10号全量抽取到ods层(全量初始化)
1
2
3
4
5
6
7
8# 把ods——order_info_20200910数据全量插到dwd层2020-09-10分区
insert overwrite table dwd_order_info_di partition(date_id = '2020-09-10')
select
order_id
,order_status
,create_time
,update_time
from ods_order_info_20200910;
9月11号抽取更新的数据及当天新增的数据,即订单id为2,3,4,5的数据
dwd_order_info_di表9月10号的分区数据与ods_order_info_20200911增量抽取的数据合并,有2种方案:
a.两个表通过主键关联,dwd表存在并且ods表不存在的数据union all一下ods_order_info_20200911表所有的数据,即全量数据插入到dwd表的9月11号的分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22insert overwrite table dwd_order_info_di partition(date_id = '2020-09-11')
select
t1.order_id
,t1.order_status
,t1.create_time
,t1.update_time
from
dwd_order_info_di t1
left join
ods_order_info_20200911 t2
on t1.order_id = t2.order_id
where t1.date_id = '2020-09-10'
and t2.order_id is null
union all
select
order_id
,order_status
,create_time
,update_time
from
ods_order_info_20200911
;
b.两个表数据union all一下,再根据order_id去重(根据order分组,更新时间降序,取第一条)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38insert overwrite table 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
dwd_order_info_di
where date_id = '2020-09-10'
union all
select
order_id
,order_status
,create_time
,update_time
from
ods_order_info_20200911
) t1
) t2
where t2.rn = 1
;
特殊增量表:da表,每天的分区就是当天的数据,其数据特点就是数据产生后就不会发生变化,如日志表。
拉链表
拉链表维护历史状态,以及最新状态数据适用一下情况:
数据量比较大
表中的部分字段会被更新
需要查看某一个时间点或者时间段的历史快照信息
更新的比例和频率不是很大,如果表中信息变化不是很大,每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费优点
9月10号全量抽取到ods层1
2
3
4
5
6
7create table 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’ 表示该条记录目前处于有效状态
1
2
3
4
5
6
7
8
9
10create table 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
1
2
3
4
5
6
7
8
9
10insert overwrite table 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
from
ods_order_info_20200910;
9月11号抽取更新的数据及当天新增的数据到ods层,即订单id为2,3,4,5的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23insert overwrite table 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_dt
from
dwd_order_info_dz t1
left join ods_order_info_20200911 t2
on t1.order_id = t2.order_id
where t1.date_id = '2020-09-10'
union all
SELECT
t1.order_id
,t1.order_status
,t1.create_time
,t1.update_time
,to_date(update_time) as start_dt
,'9999-12-31' as end_dt
FROM ods_order_info_20200911 t1
;
查询当前的所有有效记录1
2
3
4
5
6
7select
*
from
dwd_order_info_dz
where
date_id = '2020-09-11'
and end_dt ='9999-12-31';
查询9月10号历史快照1
2
3
4
5
6
7
8select
*
from
dwd_order_info_dz
where
date_id = '2020-09-10'
and start_dt <= '2020-09-10'
and end_dt >='2020-09-10';
查询9月11号历史快照1
2
3
4
5
6
7
8select
*
from
dwd_order_info_dz
where
date_id = '2020-09-11'
and start_dt <= '2020-09-11'
and end_dt >='2020-09-11';
总结
1、如果数据量不是很大(不超过20W)且预估后续增长的非常慢,可以考虑全量表抽取,这是最简便的方法
2、如果数据量目前来说不是很大,但是业务发展很快,数据量一段时间后就会上来,建议增量抽取
3、目前数据量本身就非常大,肯定是需要增量抽取的,比如现在有10亿数据,如果你每天全量抽取一遍,相信我,你会抽哭的
4、对于历史状态需要保存的,这个时候就需要使用拉链表了,实际工作中,使用拉链表的场景并不会太多,比如订单表,保存订单历史状态,维表(缓慢变化维的处理)
hive增量表和全量表_你需要了解的全量表,增量表及拉链表相关推荐
- 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍
线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...
- 全栈路线_程序员该走全栈路线还是深度专家路线?
程序员该走全栈路线,还是深度路线?相信这个问题是所有程序员都会思考的一个问题. 先说说何谓全栈?全栈工程师,英文Full Stack engineer,一般是指能独立完成产品开发的人,同时具备前端和后 ...
- mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...
表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...
- 为什么jsp的form表单不能跳转_手把手教你实现SEM投放监控转化--表单类
对于SEM投放来说,数据分析是重中之重,为什么要做SEM数据分析?SEM数据分析的最大意义在于总结过去,预判未来,改善投放.然后通过一系列的改善,使账户的投放运作走上良性循环.今天给大家分享表单类获客 ...
- mysql 删除表记录的 存储过程命令_用SQL语句删除一个数据库的所有表和所有存储过程...
如果数据库里有很多表和存储过程,要用手动鼠标右键一个个删除是很麻烦的,用SQL语句来删除就方便很多了 删除所有的表: 如果由于外键约束删除table失败,则先删除所有约束: --/第1步******* ...
- layuiajax提交表单控制层代码_无代码搭建系统(一)——流程表单搭建
迎着2020疫情带来的线上办公.远程协同办公,把无代码带上风口浪尖,众多无代码厂商迅速发展起来,推出自己的无代码产品.实现全民开发,是无代码发展的愿景和目标.数字化和网络化使各行各业的客户对应用开发的 ...
- mysql某个表被行锁了_一文搞懂MySQL行锁、表锁、间隙锁详解
准备工作 创建表 tb_innodb_lock drop table if exists test_innodb_lock; CREATE TABLE test_innodb_lock ( a INT ...
- mysql向表中填入数据_教你快速掌握如何向MySQL的表中录入数据
当我们建好数据库及表后,首先想到的就是向数据库的表中输入数据.下面我们就来探讨一下如何向数据库增加数据: 1.常用的方法是insert语句 以下为引用的内容: insert into tablenam ...
- 九九乘法表python语言编程软件_编写Python程序,输出如下的九九乘法表_学小易找答案...
[其它]写出下图的梯形图程序对应的语句表 (26.0分) [简答题]PLC一般的编程语言有几种?分别是什么? (5.0分) [其它]定义一个getMax函数,返回三个数(从键盘输入的整数)中的最大值. ...
- 舞力全开加速_国行舞力全开评测:丝滑得不像是育碧服务器!
"奶奶你预定的游戏发售啦!" 盼星星盼月亮,从育碧说好的"夏季"等到寒冬,我们终于等来了国行版的<舞力全开>! 试玩版中如是写道 我们也在第一时间购 ...
最新文章
- Windows10下安装unbuntu双系统 以及花屏解决办法
- linux常用shell命令面试,shell经典笔试题目总结
- STL中map用法详解
- FckEditor2.6.4在VS2005中的使用过程
- LDA的Gibbs抽样详细推理与理解
- php dropdownlist,下拉列表多级联动dropDownList示例代码
- WEB应用组合——LAMP软件源码编译安装
- 国内镜像源的使用,提高下载速度
- linux网卡slave状态,生产环境中linux bonding 主备模式slave网卡切换的方法
- Java是什么?学了Java我们能干什么?
- 测试用例设计(等价类、边界值、因果图、判定表、正交实验)
- 用 zotero 管理文献和个人知识库
- 吴雪筠校友报告会----职场仪表、心态、自强之道
- delegate-委托
- 晚稻季湛江廉江 国稻种芯·中国水稻节:广东绿色田野农人忙
- Python爬取笑话存储在mysql里
- 为什么货币基金每万份收益会突然猛窜?
- tair和redis对比
- MFC工具箱各种控件的具体意义
- 说说那些抢票插件的事
热门文章
- java计算机毕业设计 高考志愿填报系统 高考志愿推荐系统 高考志愿填报辅助系统 ssm高考填报系统 志愿填报机器人 高考学校实景3D地图(java+ssm+百度地图+实景3D地图)
- 回顾陆奇的传奇人生,下一站是“星辰和大海”
- 数据治理:数据治理框架和标准
- (一)egg-基础功能
- 盛迈坤电商:拼多多营销策划的方法
- 大数据系统的学习路径、思维导图
- 计算机进制单位tb以上,计算机容量单位的换算 B,KB,MB,GB,TB
- Altium Designer 生成 BOM(Bill of Material)
- 第五章 矩阵的相似对角化
- 微信小程序获取用户位置信息并显示到地图上