ETL
中增量更新是一个比较依赖与工具和设计方法的过程,
Kettle
中主要提
供
Insert
/
Update
步骤,
Delete
步骤和
Database
Lookup
步骤来支持增量更
新,
增量更新的设计方法也是根据应用场景来选取的,
虽然本文讨论的是
Kettle
的实现方式,
但也许对其他工具也有一些帮助。
本文不可能涵盖所有的情况,
欢
迎大家讨论。
应用场景
增量更新按照数据种类的不同大概可以分成:
1.
只增加,不更新,
2.
只更新,不增加
3.
即增加也更新
4.
有删除,有增加,有更新
其中
1
,
2
,
3
种大概都是相同的思路,使用的步骤可能略有不同,通用的方法
是在原数据库增加一个时间戳,
然后在转换之后的对应表保留这个时间戳,
然后
每次抽取数据的时候,
先读取这个目标数据库表的时间戳的最大值,
把这个值当
作参数传给原数据库的相应表,
根据这个时间戳来做限定条件来抽取数据,
抽取
之后同样要保留这个时间戳,并且原数据库的时间戳一定是指定默认值为
sysdate
当前时间(以原数据库的时间为标准),抽取之后的目标数据库的时间
戳要保留原来的时间戳,而不是抽取时候的时间。
对于第一种情况,可以使用
Kettle
的
Insert / Update
步骤,只是可以勾
选
Don
’
t
perform
any
update
选项,
这个选项可以告诉
Kettle
你只会执行
Insert
步骤。
对于第二种情况可能比较用在数据出现错误然后原数据库有一些更新,
相应的目
标数据库也要更新,
这时可能不是更新所有的数据,
而是有一些限定条件的数据,
你可以使用
Kettle
的
Update
步骤来只执行更新。关于如何动态的执行限定条
件,可以参考前一篇文章。
第三种情况是最为常见的一种情况,使用的同样是
Kettle
的
Insert / Update
步骤,只是不要勾选
Don
’
t perform any update
选项。
第四种情况有些复杂,后面专门讨论。
对于第
1
,
2
,
3
种情况,可以参考下面的例子。
这个例子假设原数据库表为
customers
,
含有一个
id
,
firstname
,
lastname
,
age
字段,主键为
id
,
然后还加上一个默认值为
sysdate
的时间戳字段。转换