快照表转换成拉链表的方式(hive)初始化拉链&增量更新拉链

本文详细介绍了如何在Hive中,通过快照表构建拉链表的过程,特别是在没有新增标识的情况下,通过比较每个字段的变化实现快照表到拉链表的转换。文章分为两步,第一步是从存量快照初始化拉链,第二步是增量合并拉链。在增量合并中,涉及到对历史拉链和每日新增及变化数据的合并,确保拉链表的正确性。

从快照表到拉链表的构建方式(hive)

注意:本文主要讲解在没有新增标识(最后修改时间)的前提下,通过每个字段的比对变更将存量+后续增量的快照表转换成对应的拉链表

初始数据和存量数据如下:

快照表->拉链表初始化!!!!!!!!!!!!!

NOTE:这次实践主要是针对hive中的拉链表,通过快照表将hive中得到快照维度表一次性初始化转换成拉链表
AUTHOR:SHUFANGGEGE

start:原始的快照表数据
id  name inc_day
A   a1   20220101
A   a1   20220102
A   a1   20220104
A   a2   20220105
A   a3   20220106
A   a3   20220107
A   a2   20220108
A   a1   20220109
B   b1   20220102
A   b2   20220106


end:目标结果的快照数据
id  name  dw_start_date  dw_end_date
A   a1     20220101       20220105 
A   a2     20220105       20220106 
A   a3     20220106       20220108 
A   a2     20220108       20220109 
A   a1     20220109       99991231 
B   b1     20220102       20220106
B   b2     20220106       99991231

过程分2步骤:

  • 从存量快照初始化拉链 (1)
  • 增量合并拉链 (2)

1 从存量快照初始化拉链

1.1 具体思路与数据变化过程

在这里插入图片描述

1.2 初始化代码

--创建模拟的快照表
DROP TABLE test_zip;
CREATE TABLE test_zip stored as parquet as 
select 'A' as id ,'a1' as name, '20220101' as inc_day 
union all select 'A' as id , 'a1' as name , '20220102' as inc_day 
union all select 'B' as id , 'b1' as name , '20220102' as inc_day 
union all select 'A' as id , 'a1' as name , '20220104' as inc_day 
union all select 'A' as id , 'a2' as name , '20220105' as inc_day 
union all select 'B' as id , 'b2' as name , '20220106' as inc_day 
union all select 
### Hive增量、全量拉链的实现与使用场景 在Hive中,增量、全量拉链是数据存储和处理中的常见设计模式。以下是它们的定义、实现方式以及适用场景。 #### 1. 增量 增量用于存储每天新增或更新的数据。其特点是只包含每日新增或变化的数据,不包含历史数据。 - **实现**: 增量通常通过ETL过程生成,仅导入当天新增或更新的数据。例如,可以通过`insert into`语句将新数据追加到目标中[^4]。 ```sql insert into table wedw_dwd.order_info_inc partition(date_id = '2023-03-01') select order_id, order_status, create_time, update_time from wedw_ods.order_info_20230301; ``` - **使用场景**: - 数据每日新增量较大,但查询时只需关注最近几天的数据。 - 数据快速变化(如事务型事实),不适合长期保存历史数据[^2]。 #### 2. 全量 全量用于存储某一时刻的完整数据快照。其特点是包含所有数据的历史记录,适合需要完整数据集的场景。 - **实现**: 全量通常通过`insert overwrite`语句生成,覆盖目标分区的所有数据。例如,将某天的全量数据插入到目标中[^4]。 ```sql insert overwrite table wedw_dwd.order_info_full partition(date_id = '2023-03-01') select order_id, order_status, create_time, update_time from wedw_ods.order_info_20230301; ``` - **使用场景**: - 数据变化频繁,且需要定期生成完整的数据快照。 - 查询时需要获取某一时间点的完整数据集。 #### 3. 拉链 拉链是一种特殊的设计模式,用于记录数据的历史变更情况。其特点是每条记录都有一个有效时间范围(`start_date`和`end_date`),示该记录的有效时间段。 - **实现**: 拉链通过维护每条记录的有效时间范围来记录历史变更。每次数据更新时,需要对旧记录进行封链(设置`end_date`为当前日期),并插入一条新记录(`start_date`为当前日期,`end_date`为未来日期)。例如: ```sql -- 封链旧记录 insert overwrite table wedw_dwd.order_info_chain partition(date_id = '2023-03-01') select order_id, order_status, create_time, update_time, start_date, current_date as end_date from wedw_dwd.order_info_chain where date_id = '2023-02-28' and order_id in ( select order_id from wedw_ods.order_info_20230301 ); -- 插入新记录 insert into table wedw_dwd.order_info_chain partition(date_id = '2023-03-01') select order_id, order_status, create_time, update_time, current_date as start_date, '9999-12-31' as end_date from wedw_ods.order_info_20230301; ``` - **使用场景**: - 数据会发生新增和变化,但大部分数据是不变的,且变化较慢(如用户信息中的手机号)[^2]。 - 需要记录数据的历史变更情况,并支持查询某一时间点的历史数据。 ### 总结 - 增量适合存储每日新增或更新的数据,查询时只需关注最近几天的数据。 - 全量适合存储某一时刻的完整数据快照,查询时需要获取完整的数据集。 - 拉链适合记录数据的历史变更情况,并支持查询某一时间点的历史数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值