所谓的Passive组件,也就是静态组件,它的特点是:
来一行数据,我处理一下,然后输出一行数据。
可以看右图简单的示意图
如果是Active组件,那么输入的数据和最终输出的数据是不一定对等的。
我自己的感觉中,Active组件更像是系统中的临时表。我们的数据经过了Active组件的时候,会被全部先加载到临时表中,等数据加载完以后,再做一些临时表相关的操作。比如:分组,关联查询,排序,过滤(Filter)等等操作。
就一个最简单的例子 :
当Informatica workflow启动的时候,观察Monitor可以发现,Source Qualifier 会先把所有的Source文件加载的缓存中,才会开始接下来的ETL过程。(当然可能因为缓存大小的设置不同,只先把一部分加载到缓存中就开始其余的ETL操作,待确认)
二Source Qualifier就是一个非常典型的Active组件
开发中静态和动态组件使用的过程中是经常会遇到坑的,总结下来,其实有以下几种:
1:静态组件可以随意连接到动态组件上 一静对一动
2:多个静态组件可以随意的连到一个动态组件上 多静对一动
3:一个动态组件可以连接到静态组件上 一动对一静
4:多个动态组件没法连到一个静态组件上 多动无法对一静
5:一个静态组件一个动态组件没法同时连接到一个静态组件中 一静一动无法对一静
6:已经静态组件和一个动态组件可以连接到同一个动态组件中 一静一动对一动
我大概想了一下,静态组件对于数据的变动是行级别的,就是处理一行数据,就返回一行数据。
但是动态组件对于数据处理却不是行级别的,很多都是遍历完所有的数据,并且多所有的数据进行处理后,返回一个统一的结果。
打个比方:静态组件的入参是一行数据,返回值是一行结果。
动态组件的入参是所有的数据一起,返回的结果也是所有的数据一起。比如:Joinner其实是把两边的所有的数据都加载到缓存中,然后一起进行计算,得出最后的一个结果。因为Join操作是依赖于所有的数据才可以得到结果的。
而如果是一个Expression 组件的话,它接受了每一行数据,然后通过表达式计算,并且返回一个结果就可以了。不依赖于整体数据。
最后我们可以得出一个答案,为什么多个动态组件没法连接到一个静态组件上,因为:
当同一个源A,连到两个静态组件B1,B2上面,然后这两个静态组件B1,B2最后又一起连接到一个静态组件C上面的时候,我们可以保证的是:每一次从组件B1,B2上面流过来的数据,都是源A当中的同一行。但是,如果同一个源D,连接到两个动态组件E1,E2中,经过这两个动态组件处理后,在把这E1,E2同时连到静态组件F上的话,我们是没法保证每一次执行,输送到F上面的数据来自于源D中的同一行。所以,两个动态组件没法连接到一个静态组件上。甚至,这E1和E2都没法保证有相同的行数,这个时候静态组件根本没法处理。这不合Informatica的设计理念。