拉链表、增量表、全量表

本文详细解析了拉链表、增量表和全量表的概念及应用。拉链表记录事物所有变化,适用于大数据量表和需历史信息查询场景;增量表仅保留新增数据,用于实时数据更新;全量表保存所有数据,包括历史记录,确保数据完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拉链表、增量表、全量表

拉链表

记录一个事物从开始到当前状态的所有的变化信息。适用于“数据量非常大的表、表中的某些字段会被更新操作、需要查看历史信息、表的数据更新变化不是很大。”拉链表中会定义数据的st_date和end_date。

初始表A

cust_idaccountst_dtend_dt
a1002017080129991231
b2002017080129991231
c1002017080129991231

20170802:更新数据表B

cust_idaccountst_dtend_dt
a2002017080229991231
b3002017080229991231

更新表A

update A
set  end_dt=mat_date
where cust_id in (select cust_id from B)
cust_idaccountst_dtend_dt
a1002017080120170802
b2002017080120170802
c1002017080129991231

导入更新数据B

insert into A select * from B

得到最终表:

cust_idaccountst_dtend_dt
a1002017080120170802
b2002017080120170802
c1002017080129991231
a2002017080229991231
b3002017080229991231

增量表

只保留当前新增的数据,例如:

初始表A

cust_idaccountst_dt
a10020170801
b20020170801
c10020170801

2017年8月2日:a账户又存了300

cust_idaccountst_dt
a30020170802

最终表

cust_idaccountst_dt
a30020170802
a10020170801
b20020170801
c10020170801

全量表

保存用户所有的数据(包括新增与历史数据),例如:

初始表A

cust_idaccountst_dt
a10020170801
b20020170801

2017年8月2日:a账户没存、b账户没存、c账户存200

cust_idaccountst_dt
a10020170802
b20020170802
c10020170802

最终表

cust_idaccountst_dt
a10020170801
b20020170801
a10020170802
b20020170802
c10020170802
### **增量全量表拉链的应用场景解析** #### **1. 核心概念对比** ```mermaid graph LR 全量表-->|每日全量替换|Complete[数据完整性] 增量-->|仅新变更|Delta[处理效率] 拉链-->|历史追溯|History[时态分析] ``` #### **2. 典型应用场景** | 类型 | 适用场景 | 示例 | |----------|--------------------------------------------------------------------------|----------------------------------------------------------------------| | **全量表** | 1. 数据量小的维度<br>2. 需要绝对准确性的基准数据<br>3. 无变更历史需求 | 国家编码、产品基础信息 | | **增量** | 1. 事件流水数据<br>2. 大数据量的事实<br>3. 仅需最新状态的场景 | 用户浏览日志、交易流水记录 | | **拉链** | 1. 缓慢变化维度(SCD)<br>2. 需要历史追溯的业务<br>3. 变化频率适中的维度数据 | 用户会员等级变更记录、商品价格变更历史 | #### **3. 技术实现示例** **(1)增量处理(Spark实现)** ```python # 每日增量合并 new_data = spark.read.parquet("/new_data/") existing_data = spark.read.parquet("/full_data/") result = existing_data.union(new_data).dropDuplicates(["id"]) result.write.mode("overwrite").parquet("/full_data/") ``` **(2)拉链SQL实现** ```sql -- 拉链结构示例 CREATE TABLE user_chain ( user_id BIGINT, name STRING, start_date DATE, end_date DATE, is_current BOOLEAN ); -- 更新逻辑 INSERT OVERWRITE TABLE user_chain SELECT user_id, name, CASE WHEN new_rec THEN effective_date ELSE start_date END, CASE WHEN expired THEN effective_date ELSE end_date END, NOT expired AS is_current FROM ( -- 新旧数据比对逻辑 SELECT ..., LEAD(effective_date) OVER (PARTITION BY user_id ORDER BY effective_date) IS NULL AS new_rec, effective_date < CURRENT_DATE() AS expired FROM source_data ); ``` #### **4. 性能对比分析** | 维度 | 全量表 | 增量 | 拉链 | |--------------|-------------|-------------|---------------| | **存储成本** | 高(每日全量) | 低(仅增量) | 中(历史版本) | | **查询效率** | 快(无JOIN) | 快(数据量少) | 慢(需时间筛选) | | **ETL复杂度** | 低 | 中 | 高 | | **历史追溯** | 不支持 | 有限支持 | 完全支持 | #### **5. 混合使用案例** ```sql -- 电商平台典型组合 WITH -- 全量维度 product_base AS (SELECT * FROM dim_product WHERE dt='2023-12-01'), -- 增量事实 order_new AS (SELECT * FROM fact_order WHERE dt='2023-12-01'), -- 拉链维度 user_level AS ( SELECT * FROM dim_user_level WHERE '2023-12-01' BETWEEN start_date AND end_date ) -- 业务查询 SELECT ... FROM order_new JOIN product_base USING(product_id) JOIN user_level USING(user_id); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值