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

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

相关推荐
B站计算机毕业设计超人20 分钟前
计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群
大数据·python·机器学习·spark·课程设计·数据可视化·推荐算法
沙滩de流沙1 小时前
Spark生态圈
大数据·分布式·spark·scala
lucky_syq8 小时前
Spark和Hive的联系
大数据·hive·spark
过往记忆8 小时前
告别 Shuffle!深入探索 Spark 的 SPJ 技术
大数据·前端·分布式·ajax·spark
袖清暮雨16 小时前
5_SparkGraphX讲解
大数据·算法·spark
出发行进18 小时前
Hive其九,排名函数,练习和自定义函数
大数据·数据仓库·hive·hadoop·数据分析
winner888119 小时前
Hive SQL 之 `LATERAL VIEW EXPLODE` 的正确打开方式
hive·hadoop·sql·explode·lateral view·hive split
SelectDB技术团队1 天前
一文了解多云原生的现代化实时数仓 SelectDB Cloud
大数据·数据库·数据仓库·云原生·云计算
工业互联网专业1 天前
Python大数据可视化:基于Python对B站热门视频的数据分析与研究_flask+hive+spider
hive·python·数据分析·flask·毕业设计·源码·spider