Informatica: Build XML file with customized name

    很少发博文,潜水的时候居多。 最近看到一些非常好的博文,佩服之余不禁自惭。如果能把自己的一些经验和知识共享出来,告诉别人前方是死路,请绕道而行,确实是一件很有意思的一件事。我最近在做一些关于Informatica的工作,花了一些时间自己探索了一些东西,分享一下。

     Informatica其实是一套非常强大的数据集成工具,更多关于Informatica的介绍可以看一下百度百科

     这篇文章我想关注Power Center的一个简单功能:自定义生成文件的名字。例如FlatFile target, XML target他们都是用于生成文件的,有时候需要在一次批处理中生成一批文件,而不仅仅是一个文件。举个例子,数据库里面有10条记录,想要把这10条记录生成10个文件,每个文件的内容由一条记录组成。

     在这样的case中,首先尝试的就是在生成mapping的workflow里面,设置属性Output filename, 如下图所示。其实这是行不通了。

     image

      这个属性Output filename的原理是这样的:在一次提交中,如果target的属性file name不为空,则会使用这个属性的值作为生成文件的名字;如果target的属性file name是空,则整个work flow会使用Output filename的值做为生成文件的名字。

      这就牵扯到了target的属性file name了? 这个属性其实在FlatFile target和XML target里面都是存在的,不过位置有些隐蔽,直接看下面的图示吧:

      Flat File的target的属性file name:

      image

      XML target的file name属性需要打开XML view,在上面右键点击:

      image

      在Informatica的官方论坛上,找到这些东西并不难。

      在上面的文字中,还有一个关键词: 一次提交。一次提交生成一个文件。 我们要生成多个文件,那就需要做多次提交。那如何来控制提交呢?这就必须要使用的Transaction Control这个transformation了。这个组件的功能简单来说就是这样:根据某个条件,提交数据。如这个表达式:IIF(Control_Value, TC_COMMIT_BEFORE, TC_CONTINUE_TRANSACTION)。 Control_Value是boolean 变量。这个表达式指的是如果Control_Value is True, 就把当前积累的数据全部提交,如果Control_Value是False, 则继续接收数据,等待下一次提交。

      针对Flat file的多个文件名的生成,其实在它的官方论团上的例子还是有很多不错的,如:

      Sample 1, Sample 2.     
      这里我就不对此再做更多的复述了。我这里介绍的是如果生成多个不同的XML文件。理论上来说,按照Flat file生成文件名的思路,应该是可以应用到XML上面的。 但是遗憾的是,却行不通。这个时候,却让我发现了XML Generator这个Transformation。首先,它不是一个target,是一个中间的转化组件。它用于生成XML的字符串(就是XML file 的内容)。通过熟悉它,发现它有和XML target一样功能,仅仅是生成XML String. 如果把每个XML String 都写到一个文件(flat file)中,然后这个文件命名为.xml,这不就可以实现了吗? 真是曲折啊。:)

      再总结一下,把从数据库取到的记录通过XML Generator生成XML String, 然后再把XML String写到一个Flat file,利用上面提到Flat file自定义名字的功能,实现我的目标。贴一个这个流程图的例子:

      image

      貌似一切都合乎情理,这个也确实实现了我的想法。但是在这个过程中,我还是花了两三天的时间解决了里面的一个问题:如何从流程的前面把文件名传到最后的Flat File target.

      当我开始着手这个想法时,感觉XML Generator只有固定一个输出:DataOutput.这个输出值就是生成的XML String. 其实在这个组件的属性面板里面Midstream XML Generator里面,我们是可以添加字段的。但是这些字段的输入不能来自上游,只能引用XML里面的数据。通过XML Editor编辑XML view,可以创建从XML 字段到该字段的引用,叫Pass-Thru port. 这个文档告诉你如何建立Pass-Thru port. 耐心点看,你会找到答案的。

posted on 2013-08-09 14:24  八一七  阅读(547)  评论(0编辑  收藏  举报