通过维度查询/更新实现拉链表
拉链表是针对数据仓库设计中表存储数据的方式而定义的,即记录历史,记录一个事务从开始,一直到当前状态的所有变化的信息。
1. 逻辑分析
  1. 创建数据表、添加示例数据
  2. 抽取源数据,通过kettle组件【维度查询/更新】来实现维表中的start_date与end_date首尾相连,实现该人员的每个状态都保存在维表当中。
  3. 通过组件来维护【维度查询/更新】组件的一个小bug。
2. 见图如见物

示例数据

kettle javascript 获取表输入变量 kettle 获取表结构_etl

绿线代表张三的电话号码更新,红色代表李四的职级的更新,可以清晰的看出两条数据更新且start_date与end_date首尾相连。、

kettle javascript 获取表输入变量 kettle 获取表结构_数据仓库_02


kettle javascript 获取表输入变量 kettle 获取表结构_数据仓库_03

3. 实现步骤
  1. 示例数据
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');
  1. KETTLE脚本配置过程
  1. 表输入【抽取源表的数据,添加当前时间字段】
  2. 维度查询/更新
  1. 配置数据库连接
  2. 配置目标表【维度表】
  3. 配置关联字段【源表与目标表】
  4. 配置代理关联字段【目标表】、相当于二级关联字段吧(个人理解)
  5. 配置版本字段【目标表】、数据更新的版本号
  6. 配置stream日期字段、当前时间
  7. 配置开始时间【目标表】、数据的发生时间
  8. 配置结束时间【目标表】、数据的结果时间
  9. 配置更新、插入字段【源表与目标表】。
  1. 阻塞数据直到步骤都完成
    执行sql前需要先阻塞任务,否则sql脚本优先级较高
  2. 执行SQL脚本
    delete from user_dimension_table where user_id is null
  3. 脚本测试
  1. 执行完示例数据,此时你有user_source表有数据,user_dimension_table表无数据。
  2. 执行上述配置的kettle程序,此时user_dimension_table有数据且与user_source表相同。
  3. 执行更新user_source【源表】的更新SQL脚本
-- 更新员工数据
UPDATE user_source SET phone='16666666666' WHERE user_id = 1;
UPDATE user_source SET job_title='COOOOOO' WHERE user_id = 2;
  1. 查询user_source【源表】的数据、数据已经发生改变。
    SELECT * FROM user_source;
  2. kettle javascript 获取表输入变量 kettle 获取表结构_数据仓库_04


  1. 执行kettle程序,并且查看user_dimension_table的数据
    SELECT * FROM user_dimension_table ORDER BY user_id
  2. kettle javascript 获取表输入变量 kettle 获取表结构_数据仓库_05