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

[复制链接]
发表于 2025-11-18 17:32:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        在基于 Hive on Spark 的离线数据堆栈中装载拉链表(SCD,Slowly Changing Dimension)通常是为相识决维度表中的汗青变革跟踪题目(告急是 SCD2 范例的拉链表)。

什么是拉链表?

拉链表用于记载维度表中数据的汗青变革,通常布局如下:

  • id(主键)
  • 字段(维度字段,如姓名、所在等)
  • start_date(有效开始时间)
  • end_date(有效竣事时间)
  • is_active(是否当宿世效,通常用布尔值或标记位表现)
拉链表的特性:

  • 汗青记载不可修改。
  • 每次变革会天生一条新记载。
  • is_active=1 的记载是当宿世效的记载。

拉链表的装载场景


  • 初始装载: 第一次加载全量数据,天生拉链表。
  • 增量装载: 逐日新增或更新数据对拉链表举行更新(大概必要处置惩罚多个版本记载)。

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

1. 数据预备


  • 目标拉链表: 假设已有 dim_table_zip(拉链表),存储汗青和当前记载。
  • 增量数据表: 增量数据通常泉源于究竟表、Kafka 等流,存储在 dim_table_delta。
2. 拉链表装载的步调

(1) 创建初始拉链表
对于初次装载,直接从原始维度表全量加载数据,设置初始的 start_date 和 end_date:
  1. INSERT INTO TABLE dim_table_zip
  2. SELECT
  3.     id,
  4.     name,
  5.     address,
  6.     CURRENT_DATE AS start_date,
  7.     '9999-12-31' AS end_date,
  8.     1 AS is_active
  9. FROM
  10.     source_dim_table;
复制代码

(2) 增量装载
对于逐日的增量数据装载,必要以下步调:

  •         提取增量数据:
            增量表 dim_table_delta 通常包罗如下数据:

    • id
    • name
    • address
    • update_date(数据更新时间)
    示例:
    1. SELECT * FROM dim_table_delta;
    复制代码

  •         关联汗青记载:
            将增量数据与当前的拉链表 dim_table_zip 举行关联(按 id 匹配)。
    1. SELECT
    2.     z.id AS zip_id,
    3.     d.id AS delta_id,
    4.     z.name AS zip_name,
    5.     d.name AS delta_name,
    6.     z.address AS zip_address,
    7.     d.address AS delta_address,
    8.     z.start_date,
    9.     z.end_date,
    10.     z.is_active
    11. FROM
    12.     dim_table_zip z
    13. FULL OUTER JOIN
    14.     dim_table_delta d
    15. ON
    16.     z.id = d.id;
    复制代码
  •         辨认变革记载:

    • 比力 dim_table_zip(拉链表)和 dim_table_delta(增量表)数据的变革:

      • 假如增量数据中字段发生变革,需关闭旧记载,并天生新记载。
      • 假如增量数据没有变革,则保持原记载稳定。

    示例逻辑:
    1. SELECT
    2.     z.id AS zip_id,
    3.     d.id AS delta_id,
    4.     CASE
    5.         WHEN z.name != d.name OR z.address != d.address THEN 'changed'
    6.         WHEN d.id IS NULL THEN 'expired'
    7.         ELSE 'unchanged'
    8.     END AS status
    9. FROM
    10.     dim_table_zip z
    11. FULL OUTER JOIN
    12.     dim_table_delta d
    13. ON
    14.     z.id = d.id;
    复制代码

  •         天生新的拉链记载:

    • 关闭旧记载:
                      将旧记载的 end_date 设置为 update_date 并标记为 is_active=0。
    • 插入新记载:
                      为增量记载插入新的拉链表记载。
    示例:
    1. -- 更新旧记录的 end_date 和 is_active
    2. INSERT INTO dim_table_zip
    3. SELECT
    4.     id,
    5.     name,
    6.     address,
    7.     start_date,
    8.     d.update_date AS end_date,
    9.     0 AS is_active
    10. FROM
    11.     dim_table_zip z
    12. JOIN
    13.     dim_table_delta d
    14. ON
    15.     z.id = d.id
    16. WHERE
    17.     z.is_active = 1
    18.     AND (z.name != d.name OR z.address != d.address);
    19. -- 插入新的增量记录
    20. INSERT INTO dim_table_zip
    21. SELECT
    22.     id,
    23.     name,
    24.     address,
    25.     d.update_date AS start_date,
    26.     '9999-12-31' AS end_date,
    27.     1 AS is_active
    28. FROM
    29.     dim_table_delta d;
    复制代码

           

3. 优化发起


  •         分区计划:
            为拉链表计划按时间分区(如 start_date),进步查询和更新服从。
  •         存储格式:
            使用高效的存储格式(如 ORC 或 Parquet),提升 I/O 性能。
  •         克制全表扫描:
            每次装载增量时,仅更新受影响的记载,淘汰对拉链表的全表扫描。
  •         宽表更新:
            假如维度表字段很多,最好对字段变革天生哈希值(MD5/SHA)比力,克制逐字段查抄。

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

下面是完备 SQL 示例:
  1. -- 更新旧记录
  2. INSERT INTO TABLE dim_table_zip
  3. SELECT
  4.     z.id,
  5.     z.name,
  6.     z.address,
  7.     z.start_date,
  8.     d.update_date AS end_date,
  9.     0 AS is_active
  10. FROM
  11.     dim_table_zip z
  12. JOIN
  13.     dim_table_delta d
  14. ON
  15.     z.id = d.id
  16. WHERE
  17.     z.is_active = 1
  18.     AND (z.name != d.name OR z.address != d.address);
  19. -- 插入新的增量记录
  20. INSERT INTO TABLE dim_table_zip
  21. SELECT
  22.     d.id,
  23.     d.name,
  24.     d.address,
  25.     d.update_date AS start_date,
  26.     '9999-12-31' AS end_date,
  27.     1 AS is_active
  28. FROM
  29.     dim_table_delta d;
复制代码

总结

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

  • 增量数据的正确提取。
  • 与汗青拉链表的字段比力。
  • 对变革数据举行关闭旧记载、插入新记载的处置惩罚。
通过公道计分别区和存储格式,可以明显进步装载性能。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表