kettle
增量更新设计
ETL
中增量更新是一个比较依赖与工具和设计方法的过程
, Kettle
中主要提供
sert/
Update
步骤
, Delete
步骤和
Database Lookup
步骤来支持增量更新增量更新的设计方法也
是根据应用场景来选取的
,
虽然本文讨论的是
Kettle
的实现方式
,
但也许对其他工具也有
一些帮助。
1
、增量分类
应用场景增量更新按照数据种类的不同大概可以分成:
1
、
增加
,
不更新
2
、
更新
,
不增加
3
、
即增加也更新
4
、
有删除
,
有增加
,
有更新
其中
1,2,3
种大概都是相同的思路
,
使用的步骤可能略有不同
,
通用的方法是在原数据库
增加一个时间戳
,
然后在转换之后的对应表保留这个时间戳
,
然后每次抽取数据的时候
,
先读
取这个目标数据库表的时间戳的最大值
,
把这个值当作参数传给原数据库的相应表
,
根据这
个时间戳来做限定条件来抽取数据
,
抽取之后同样要保留这个时间戳
,
并且原数据库的时间
戳一定是指定默认值为
date
当前
(
以原数据库的时间为标准
),
抽取之后的目标数据库的时
戬要保留原来的时间戳
,
而不是抽取时候的时间。
对于第一种情况
,
可以使用
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,1 astnameage
字段
,
主键为
id,
然后还加默认值为
sysdate
的时间戳字段。
转换之后的结果类似
:id, firstname,1 astname,age, updatedate.
整个设计流程大概如:
其中第一个步骤的
sql
大概如下模式:
Select
max(updatedate)
from
target_customer
;
你会注意到第二个步骤和第一个步骤的连接是黄色的线,
这是因为第二个
table
input
步骤把前面一个步骤的输出当作一个参数来用,所有
Kettle
用黄色的线来表示,第二个
table
input
的
sql
模式大概如下:
Select
field1
,
field2
,
field3
from
customers
where
updatedate
>
?
后面的一个问号就是表示它需要接受一个参数,你在这个