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_dateend_date

sql 复制代码
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(数据更新时间)

    示例:

    sql 复制代码
    SELECT * FROM dim_table_delta;
  2. 关联历史记录:

    将增量数据与当前的拉链表 dim_table_zip 进行关联(按 id 匹配)。

    sql 复制代码
    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(增量表)数据的变化:
      • 如果增量数据中字段发生变化,需关闭旧记录,并生成新记录。
      • 如果增量数据没有变化,则保持原记录不变。

    示例逻辑:

    sql 复制代码
    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
    • 插入新记录:
      为增量记录插入新的拉链表记录。

    示例:

    sql 复制代码
    -- 更新旧记录的 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 示例:

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. 对变化数据进行关闭旧记录、插入新记录的处理。

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

相关推荐
神奇侠20249 小时前
Hive SQL常见操作
hive·hadoop·sql
SelectDB技术团队12 小时前
从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效
大数据·数据仓库·clickhouse·kylin·实时分析
itachi-uchiha15 小时前
Docker部署Hive大数据组件
大数据·hive·docker
viperrrrrrrrrr716 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
Leo.yuan19 小时前
API是什么意思?如何实现开放API?
大数据·运维·数据仓库·人工智能·信息可视化
qq_4084133919 小时前
spark 执行 hive sql数据丢失
hive·sql·spark
后端码匠19 小时前
Spark 单机模式部署与启动
大数据·分布式·spark
qq_463944861 天前
【Spark征服之路-2.3-Spark运行架构】
大数据·架构·spark
workflower1 天前
量子比特实现方式
数据仓库·服务发现·需求分析·量子计算·软件需求
yt948321 天前
如何在IDE中通过Spark操作Hive
ide·hive·spark