通过维度查询/更新
实现拉链表
拉链表是针对数据仓库设计中表存储数据的方式而定义的,即记录历史,记录一个事务从开始,一直到当前状态的所有变化的信息。
1. 逻辑分析
- 创建数据表、添加示例数据
- 抽取源数据,通过kettle组件【
维度查询/更新
】来实现维表中的start_date与end_date首尾相连,实现该人员的每个状态都保存在维表当中。 - 通过组件来维护【
维度查询/更新
】组件的一个小bug。
2. 见图如见物
示例数据
绿线代表张三的电话号码更新,红色代表李四的职级的更新,可以清晰的看出两条数据更新且start_date与end_date首尾相连。、
3. 实现步骤
- 示例数据
CREATE TABLE user_source(
user_id int,
name varchar(8),
job_title varchar(8),
phone varchar(16)
);
-- 创建用户维度表
CREATE TABLE user_dimension_table(
agency_it int,
user_id int,
name varchar(8),
job_title varchar(8),
phone varchar(16),
versionno int,
start_date date,
end_date date
);
-- 清空原始数据
TRUNCATE TABLE user_source;
TRUNCATE TABLE user_dimension_table;
-- 初始化员工数据
INSERT INTO user_source VALUES(1,'张三','CTO','13613518884');
INSERT INTO user_source VALUES(2,'李四','CFO','15321587651');
- KETTLE脚本配置过程
- 表输入【抽取源表的数据,添加当前时间字段】
- 维度查询/更新
- 配置数据库连接
- 配置目标表【维度表】
- 配置关联字段【源表与目标表】
- 配置代理关联字段【目标表】、相当于二级关联字段吧(个人理解)
- 配置版本字段【目标表】、数据更新的版本号
- 配置stream日期字段、当前时间
- 配置开始时间【目标表】、数据的发生时间
- 配置结束时间【目标表】、数据的结果时间
- 配置更新、插入字段【源表与目标表】。
- 阻塞数据直到步骤都完成
执行sql前需要先阻塞任务,否则sql脚本优先级较高 - 执行SQL脚本
delete from user_dimension_table where user_id is null
- 脚本测试
- 执行完示例数据,此时你有
user_source
表有数据,user_dimension_table
表无数据。 - 执行上述配置的kettle程序,此时
user_dimension_table
有数据且与user_source
表相同。 - 执行更新
user_source
【源表】的更新SQL脚本
-- 更新员工数据
UPDATE user_source SET phone='16666666666' WHERE user_id = 1;
UPDATE user_source SET job_title='COOOOOO' WHERE user_id = 2;
- 查询
user_source
【源表】的数据、数据已经发生改变。SELECT * FROM user_source;
- 执行kettle程序,并且查看
user_dimension_table
的数据SELECT * FROM user_dimension_table ORDER BY user_id