简单使用kettle转换经销商信息表(改进A)

增量更新 需要自行对记录增量进行判断

元数据 为此在数据仓库中新增一张元数据表

CREATE TABLE IF NOT EXISTS dms_metadata (tbl VARCHAR(64), created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

tbl为涉及的表名,created_time为该表的创建时间(基本无用),updated_time为该表的最后更新时间。以updated_time为准,对照源表中的记录UPDATED_TIME,选择那些UPDATED_TIME是NULL或者大于等于updated_time的记录,交给kettle进行插入或更新。

目标表至少设置UPDATED_TIME为索引。

 

作为改进版本A,有这些设计:

1、首次运行时,对应于需要的源表,建立各目标表

  • 使用 CREATE TABLE IF NOT EXISTS tbl_name ( 源表结构 );
  • 使用spoon的复制表向导,获得源表的结构SQL。

2、识别增量记录,新增元数据表,此版本仅有每次作业的作业时间1个数据项(sync_time),多创建的created_time无业务意义。

  • 使用
    CREATE TABLE IF NOT EXISTS dms_metadata (`name` VARCHAR(64), `datetime` DATETIME, PRIMARY KEY (`name`)); -- 新建元数据表,用于记录同步时间
    -- INSERT INTO dms_metadata (`name`, `datetime`) VALUES ('created_time', NOW()) ON DUPLICATE KEY UPDATE `datetime` = `datetime`;  -- 插入初始值-创建时间。
    -- INSERT INTO dms_metadata (`name`, `datetime`) VALUES ('sync_time', '1970-01-01 08:00:01.000000') ON DUPLICATE KEY UPDATE `datetime` = `datetime`;  -- 插入初始值-同步时间。
    INSERT IGNORE INTO dms_metadata (`name`, `datetime`) VALUES ('created_time', NOW()); -- 更适合此场景
    INSERT IGNORE INTO dms_metadata (`name`, `datetime`) VALUES ('sync_time', '1970-01-01 08:00:01.000000'); -- 一个兼容TIMESTAMP的最小时间

    放弃本文第一段的办法,所有表共享一个时间值;

  • 使用
    UPDATE dms_metadata SET `datetime` = NOW() WHERE `name` = 'sync_time';

    更新元数据。

以上步骤的语句存储于一个SQL脚本文件,便于维护。

3、依靠sync_time,SELECT新增和更新的记录,交给kettle进行插入/更新。

  • 设置变量(在转换a中),并在SQL中使用'${var_sync_time}';
  • 尝试多个独立的“转换”放在一个文件中(在转换b中)——如果不是采用插入/更新,应该把表名设为变量,遍历表名,使用一个“转换”文件。
  • 因为已经使用增量更新,再次改变字段规模,将所有字段都同步到目标表,这表示同步整个DMS数据,有利于以后用目标表作为其他用途的源表。但这不是好主意,并非每个字段都需要,只是未来的需求不确定,我也不想在此时逐个考察所有字段。

4、在“作业”结束前使用SQL建立每个表所需的索引。

 

所以流程大概为:开始-->执行SQL脚本新建目标表/新建元数据表/删除目标表的索引-->从元数据表设置变量-->执行SQL更新元数据-->从源表插入/更新数据到目标表-->建立目标表的索引-->结束

其中SQL脚本可以按功能存储于不同文件,便于维护。

 

  

 

 

 

 已执行成功,数据较多,首次花费5分钟时间,其后为增量取数、插入/更新。本次暂未设置索引。

【本次改进结束】

 

posted @ 2021-08-26 19:17  sheffiled  阅读(93)  评论(0)    收藏  举报