拉链表的理解

拉链表是数据仓库中的一个概念
一般来说数据仓库可能每日同步一些维表到数据仓库中,如果每日都是全量同步,对数据存储必定是巨大的浪费。维表的变化大都是比较缓慢的,拉链表为每一条记录提出了有效时间的概念,即一条记录的有效期“开始时间”和“结束时间”,只有变化的数据才会产生新的记录。下面是拉链表的一些关键节点

  1. 记录开始时间是记录的创建/修改时间。
  2. 结束时间为,如果记录没有变化过通常会用一个很大的时间作为结束时间,比如3099-12-31;如果记录修改过,就修改老记录并且加一条新记录,老记录把修改时间作为有效期结束时间,再添加一条新记录,结束时间为未来时间。
  3. 取数据只要圈定范围就可以取到对应时间内有效的数据。
### Hive拉链的创建与使用 #### 什么是拉链拉链是一种常见的数据仓库设计模式,用于记录历史变更情况并保留每条记录的有效时间段。它通常包含两个时间字段:`start_date` 和 `end_date`,分别示某一条记录生效的时间范围。 在Hive中实现拉链的核心在于通过ETL过程更新现有数据集,并维护每条记录的历史版本及其有效时间区间[^1]。 --- #### 创建拉链的基本结构 假设我们需要为一张订单 (`orders`) 构建拉链,以下是其基本结构: ```sql CREATE TABLE zipper_orders ( orderid INT, createdate STRING, modifiedtime STRING, status STRING, start_date TIMESTAMP, -- 记录生效的起始时间 end_date TIMESTAMP -- 记录失效的结束时间,默认值为 '9999-12-31' ); ``` 上述的设计中,`start_date` 示该记录何时开始生效,而 `end_date` 则标记记录何时停止生效。对于当前有效的记录,`end_date` 的默认值可以设置为 `'9999-12-31'` 或其他远期日期[^4]。 --- #### 数据加载与初始化 首次加载数据时,需将原始数据转换为初始状态下的拉链形式。例如,给定以下原始数据文件 `orders.txt`[^2]: | orderid | createdate | modifiedtime | status | |---------|------------|--------------|--------| | 1 | 2023-01-01 | NULL | OPEN | | 2 | 2023-01-02 | NULL | CLOSED | 将其转化为拉链的形式: ```sql INSERT INTO zipper_orders SELECT orderid, createdate, modifiedtime, status, CAST(createdate AS TIMESTAMP) AS start_date, -- 设置生效时间为createdate TO_DATE('9999-12-31', 'yyyy-MM-dd') AS end_date -- 默认失效时间为远期 FROM orders; ``` 此时,`zipper_orders` 中存储的是所有记录的初始状态。 --- #### 更新拉链逻辑 当有新的业务数据到达时,需要对比旧数据和新数据,识别新增、删除以及修改的操作,并相应调整拉链的内容。具体流程如下: 1. **构建临时** 将最新的业务数据存入临时 `tmp_zipper` 中。此应具有相同的列结构作为目标拉链。 2. **处理新增记录** 对于那些存在于最新数据集中但不在拉链中的记录,直接插入到拉链中。 ```sql INSERT INTO zipper_orders SELECT t.orderid, t.createdate, t.modifiedtime, t.status, CURRENT_TIMESTAMP AS start_date, TO_DATE('9999-12-31', 'yyyy-MM-dd') AS end_date FROM tmp_zipper t LEFT JOIN zipper_orders z ON t.orderid = z.orderid AND z.end_date = '9999-12-31' WHERE z.orderid IS NULL; ``` 3. **处理已更改记录** 如果某些记录的状态发生了变化,则需要先关闭这些记录的老版本(即将它们的 `end_date` 修改为当前时间),再插入对应的新版本。 关闭老版本: ```sql UPDATE zipper_orders SET end_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY) WHERE orderid IN (SELECT DISTINCT orderid FROM tmp_zipper) AND end_date = '9999-12-31'; ``` 插入新版本: ```sql INSERT INTO zipper_orders SELECT t.orderid, t.createdate, t.modifiedtime, t.status, CURRENT_TIMESTAMP AS start_date, TO_DATE('9999-12-31', 'yyyy-MM-dd') AS end_date FROM tmp_zipper t; ``` 4. **清理冗余数据**(可选) 删除不再存在的记录或标记其终止时间。 --- #### 查询拉链 查询当前有效的记录可以通过过滤条件来完成: ```sql SELECT * FROM zipper_orders WHERE end_date = '9999-12-31'; ``` 如果需要查看某个特定时间点的历史快照,也可以加入额外的时间约束: ```sql WITH history_snapshot AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY orderid ORDER BY start_date DESC) AS rn FROM zipper_orders WHERE start_date <= '指定时间' AND ('指定时间' < end_date OR end_date = '9999-12-31') ) SELECT * FROM history_snapshot WHERE rn = 1; ``` --- ### 总结 以上展示了如何在Hive中创建和操作拉链的过程,包括结构调整、数据初始化、增量更新及高效查询等多个方面。这种技术广泛应用于金融、电商等领域,能够帮助分析人员更好地理解数据随时间的变化趋势[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值