当前位置: 首页 > article >正文

Hive on Spark 离线数据仓库中拉链表全流程使用

        在基于 Hive on Spark 的离线数据仓库中装载拉链表(SCD,Slowly Changing Dimension)通常是为了解决维度表中的历史变化跟踪问题(主要是 SCD2 类型的拉链表)。


什么是拉链表?

拉链表用于记录维度表中数据的历史变化,通常结构如下:

  • id(主键)
  • 字段(维度字段,如姓名、地址等)
  • start_date(有效开始时间)
  • end_date(有效结束时间)
  • is_active(是否当前生效,通常用布尔值或标志位表示)

拉链表的特性:

  1. 历史记录不可修改
  2. 每次变化会生成一条新记录。
  3. is_active=1 的记录是当前生效的记录。

拉链表的装载场景

  1. 初始装载: 第一次加载全量数据,生成拉链表。
  2. 增量装载: 每日新增或更新数据对拉链表进行更新(可能需要处理多个版本记录)。

在 Hive on Spark 中装载拉链表的思路

1. 数据准备
  • 目标拉链表: 假设已有 dim_table_zip(拉链表),存储历史和当前记录。
  • 增量数据表: 增量数据通常来源于事实表、Kafka 等流,存储在 dim_table_delta
2. 拉链表装载的步骤

(1) 创建初始拉链表
对于首次装载,直接从原始维度表全量加载数据,设置初始的 start_date 和 end_date

INSERT INTO TABLE dim_table_zip
SELECT 
    id,
    name,
    address,
    CURRENT_DATE AS start_date,
    '9999-12-31' AS end_date,
    1 AS is_active
FROM 
    source_dim_table;

(2) 增量装载
对于每日的增量数据装载,需要以下步骤:

  1. 提取增量数据:
    增量表 dim_table_delta 通常包含如下数据:

    • id
    • name
    • address
    • update_date(数据更新时间)

    示例:

    SELECT * FROM dim_table_delta;
    
  2. 关联历史记录:
    将增量数据与当前的拉链表 dim_table_zip 进行关联(按 id 匹配)。

    SELECT
        z.id AS zip_id,
        d.id AS delta_id,
        z.name AS zip_name,
        d.name AS delta_name,
        z.address AS zip_address,
        d.address AS delta_address,
        z.start_date,
        z.end_date,
        z.is_active
    FROM
        dim_table_zip z
    FULL OUTER JOIN
        dim_table_delta d
    ON
        z.id = d.id;
    
  3. 识别变化记录:

    • 比较 dim_table_zip(拉链表)和 dim_table_delta(增量表)数据的变化:
      • 如果增量数据中字段发生变化,需关闭旧记录,并生成新记录。
      • 如果增量数据没有变化,则保持原记录不变。

    示例逻辑:

    SELECT
        z.id AS zip_id,
        d.id AS delta_id,
        CASE
            WHEN z.name != d.name OR z.address != d.address THEN 'changed'
            WHEN d.id IS NULL THEN 'expired'
            ELSE 'unchanged'
        END AS status
    FROM
        dim_table_zip z
    FULL OUTER JOIN
        dim_table_delta d
    ON
        z.id = d.id;
    
  4. 生成新的拉链记录:

    • 关闭旧记录:
      将旧记录的 end_date 设置为 update_date 并标记为 is_active=0
    • 插入新记录:
      为增量记录插入新的拉链表记录。

    示例:

    -- 更新旧记录的 end_date 和 is_active
    INSERT INTO dim_table_zip
    SELECT
        id,
        name,
        address,
        start_date,
        d.update_date AS end_date,
        0 AS is_active
    FROM
        dim_table_zip z
    JOIN
        dim_table_delta d
    ON
        z.id = d.id
    WHERE
        z.is_active = 1
        AND (z.name != d.name OR z.address != d.address);
    
    -- 插入新的增量记录
    INSERT INTO dim_table_zip
    SELECT
        id,
        name,
        address,
        d.update_date AS start_date,
        '9999-12-31' AS end_date,
        1 AS is_active
    FROM
        dim_table_delta d;
    


3. 优化建议
  1. 分区设计:
    为拉链表设计按时间分区(如 start_date),提高查询和更新效率。

  2. 存储格式:
    使用高效的存储格式(如 ORC 或 Parquet),提升 I/O 性能。

  3. 避免全表扫描:
    每次装载增量时,仅更新受影响的记录,减少对拉链表的全表扫描。

  4. 宽表更新:
    如果维度表字段很多,最好对字段变化生成哈希值(MD5/SHA)比较,避免逐字段检查。


基于 Hive on Spark 的完整装载流程示例

下面是完整 SQL 示例:

-- 更新旧记录
INSERT INTO TABLE dim_table_zip
SELECT
    z.id,
    z.name,
    z.address,
    z.start_date,
    d.update_date AS end_date,
    0 AS is_active
FROM
    dim_table_zip z
JOIN
    dim_table_delta d
ON
    z.id = d.id
WHERE
    z.is_active = 1
    AND (z.name != d.name OR z.address != d.address);

-- 插入新的增量记录
INSERT INTO TABLE dim_table_zip
SELECT
    d.id,
    d.name,
    d.address,
    d.update_date AS start_date,
    '9999-12-31' AS end_date,
    1 AS is_active
FROM
    dim_table_delta d;

总结

在 Hive on Spark 中装载拉链表的关键在于:

  1. 增量数据的准确提取。
  2. 与历史拉链表的字段比较。
  3. 对变化数据进行关闭旧记录、插入新记录的处理。

通过合理设计分区和存储格式,可以显著提高装载性能。


http://www.kler.cn/a/455236.html

相关文章:

  • Java设计模式 —— 【结构型模式】外观模式详解
  • 24.try块怎么用 C#例子
  • 【Linux】硬件信息和系统及内核信息收集并对比差异
  • 深入理解HTML页面加载解析和渲染过程(一)
  • 双刃剑下的机遇与风险:交易中的杠杆效应
  • C#开发实例1—彩票选号
  • tryhackme-Cyber Security 101-Networking-Tcpdump: The Basics(tcpdump:基础知识)
  • 【只生一个好 - 单例设计模式(Singleton Pattern)】
  • C++第五六单元测试
  • VUE3+VITE简单的跨域代理配置
  • 详细对比JS中XMLHttpRequest和fetch的使用
  • 【开发问题记录】执行 git cz 报require() of ES Module…… 错误
  • 内置ALC的前置放大器D2538A/D3308
  • 一个服务器可以搭建几个网站?搭建一个网站的流程介绍
  • Rocky DEM tutorial7_Conical Dryer_锥形干燥器
  • Linux | 零基础Ubuntu卸载MySQL Server 零痕迹
  • 支持selenium的chrome driver更新到131.0.6778.204
  • 吴恩达深度学习-第一周作业-题目
  • 结构方程模型【SEM】:非线性、非正态、交互作用及分类变量分析
  • 【人工智能学习】线性回归模型使用Python实现简单的线性回归