kettle开发篇-执行SQ脚本避坑
前言:
今天我们主要来捋一捋kettle中转换对象的执行顺序,按我们正常思维来说,对象总是从左至右执行,比如如下所示的,我们将表输入即读取数据,至表输入即写入数据。就是我们最常见的裁剪表。批量读取一定时间段的数据,进行全量更新,比如更新一天的数据、一个星期、一个月、一年等等。
一、转换效率对比
从前言中,我们得知,我们日常用的最多的就是使用裁剪表,但是裁剪表有个缺点就是会将输出表中的数据先全部清空再插入,如果用户正在使用该表的数据,会导致在表输入至表输出的时间内看不到数据,以为是系统BUG或者其他的原因。容易引起用户的误解,因此面对读取插入时间超过3s的转换,一般是不建议采用裁剪表,还是采用先删除部分需要更新的数据,一般会删除一天的数据,再插入一天的数据。因此此时的转换就变成了这样。
此时如果读取的数据量没有超过1.1w条的时候,我们会发现这种方式还挺好用的,一步将删除和插入全搞定了。同样的按我们的执行逻辑,转换会先执行删除,然后读取数据,然后再插入数据至目标表。如果我们将删除数据的脚步放表输出的后面呢?又会什么执行顺序呢?
是先表输入-表输出-删除1天的数据?按我们界面的箭头顺序好像是这么回事,但是事实真的是这样嘛?如图所示,此时的执行顺序还是删除1天的数据-表输入-表输出。和上面的执行顺序是一样的,此时你是不是迷惑了,为啥会这样呢?难道是我眼花了?
二、转换对象的优先级
kettle中转换和作业的执行顺序:
1、一个作业内的转换,是顺序执行的。
2、一个转换内的步骤是并行执行的。
3、作业内不支持事务,转换内支持事务。
根据业务需要,通常需要在转换内顺序执行,小技巧如下:
1、执行SQL脚本是优先于所有步骤。
2、使用“阻塞数据直到步骤都完成”,确保其他数据步骤都完成再进行下一步骤。
如果我们不想让执行SQ脚本先执行,有没有办法让他听话呢?答案是一定的,此时我们需要用到阻塞对象,在执行SQ脚本前面安一个智能保安,保安保证前面的对象都执行完以后,再允许执行SQ脚本来运行。大家可以参考如下处理方式,有不懂的欢迎留言讨论,希望本文对你有所帮助。
- 点赞
- 收藏
- 关注作者
评论(0)