马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在基于 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:- 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) 增量装载
对于逐日的增量数据装载,必要以下步调:
- 提取增量数据:
增量表 dim_table_delta 通常包罗如下数据:
- id
- name
- address
- update_date(数据更新时间)
示例:
- SELECT * FROM dim_table_delta;
复制代码
- 关联汗青记载:
将增量数据与当前的拉链表 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;
复制代码 - 辨认变革记载:
- 比力 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;
复制代码
- 天生新的拉链记载:
- 关闭旧记载:
将旧记载的 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. 优化发起
- 分区计划:
为拉链表计划按时间分区(如 start_date),进步查询和更新服从。
- 存储格式:
使用高效的存储格式(如 ORC 或 Parquet),提升 I/O 性能。
- 克制全表扫描:
每次装载增量时,仅更新受影响的记载,淘汰对拉链表的全表扫描。
- 宽表更新:
假如维度表字段很多,最好对字段变革天生哈希值(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 中装载拉链表的关键在于:
- 增量数据的正确提取。
- 与汗青拉链表的字段比力。
- 对变革数据举行关闭旧记载、插入新记载的处置惩罚。
通过公道计分别区和存储格式,可以明显进步装载性能。
|