参考网址:https://ask.hellobi.com/blog/yuguiyang1990/7023
看到这个博主的文章,就打算把这个过程复现一下
表结构和数据:
-- 源表:tm_book
数据
-- 中间表:staging_tm_book
该表为空
-- 目标表 ods_tm_book
数据
--配置表:tm_etl_table
其中:is_run表示是否更新
这边只是为了练习,数据量都很小
整体思路如下:
1、从配置表tm_etl_table中找出目标表 ods_tm_book的最新更新时间D1;
2、如果源表tm_book中的最新时间D2>D1,表示源表中有数据更新或者插入,这部分数据先存入中间表staging_tm_book;
3、通过主键id,关联中间表staging_tm_book和目标表ods_tm_book,将目标表中的该条记录做更新;
4、最后更新配置表中表 ods_tm_book的is_run字段为1,update_time为最新的时间
--找出目标表 ods_tm_book的最新更新时间,设别名为uptime
首先将tm_etl_table中的is_run字段设为0
得到最近的更新时间
--将uptime作为变量传入,得到更新时间大于uptime的数据
将这部分数据存入中间表
--更新目标表中和配置表
分成3步:
1)删除目标表中id与中间表中id有重合的数据;
2)将中间表数据插入目标表;
3)更新配置表中的两个字段
最终结果显示:
目标表ods_tm_book
原来的数据为
更新为
id等于2的记录被更新
配置表tm_etl_table现在为
另外一种不用中间表的方法,利用kettle控件插入/更新:
结果一样,但是这个控件据说当数据量大的时候,速度很慢,还没试过大数据量的,等试过了再补充吧。