信息化 频道

Datastage抽取/处理多层目录中XML(2)

  【IT168评论】上一篇中我们介绍如何用Datastage设计Job的准备于创建,本篇着重介绍Job的设计与验证等内容。

  3.3 设置组成Job的各个Stage

Datastage抽取/处理多层目录中XML(2)
▲图17.组成Server Job的各个Stage

  3.3.1 Folder Stage设置:

  右键打开Folder Stage的属性设置,在Stage设置中编辑Folder pathname,如图,设置为D:\Data\history\#dir_date#\#dir_machine#,其中#dir_date#和#dir_machine#代表两个变量,分别决定日期文件夹和机器文件夹的名称。我们的XML原始数据就存放在相应的文件夹路径中。

Datastage抽取/处理多层目录中XML(2)
▲图18.Folder Stage属性设置

  在Output Properties中设置文件名的通配符。Wildcard项设置为*whatami*,那么Datastage会寻找并读取该路径下文件名包含“whatami”的文件。

Datastage抽取/处理多层目录中XML(2)
▲图19. Folder Stage Outputs设置

  在Outputs Columns中,我们载入一个Datastage自带的预定义表——位于/Table Definitions/Built-In下的Folder表。

Datastage抽取/处理多层目录中XML(2)
▲图20.载入Folder表

  载入后的表内容如图:

Datastage抽取/处理多层目录中XML(2)
▲图21.Folder表结构

  我们选择选择FileName为主键,即可将指定的文件导入。

  

${PageNumber}

  3.3.2 XML_Input 设置

  右键打开Stage属性设置,Input的设置就是Folder Stage的输出设置,无需更改。

  Output Transformation设置如图:

Datastage抽取/处理多层目录中XML(2)
▲图22.XML_Input Stage的Output Transformation设置

  Output Columns设置,我们导入之前定义好的XML表定义

Datastage抽取/处理多层目录中XML(2)
▲图23.导入预定义的XML表定义

  可以在这里对表列作进一步的修改和增删操作。最终输出的XML数据就与我们此处定义的表形式一致。

  3.3.3 DB2_UDB_API设置

  右键打开DB2_UDB_API的属性设置界面,在Server name, User ID 和Password栏中分别输入数据导入目标的数据库名,账户和密码

Datastage抽取/处理多层目录中XML(2)
▲图24.DB2_UDB_API Stage设置

  在Input General选项中选择数据导入的规则,此处选择的是对数据库表不作清空操作,向其中添加新的数据同时保留旧的数据。

Datastage抽取/处理多层目录中XML(2)
▲图25.DB2_UDB_API Input设置

  在Input Options的Table name栏中,我们通过浏览,选择我们之前定义好的Machine表。

Datastage抽取/处理多层目录中XML(2)
▲图26.选择预定义的MACHINE数据库表

  在Input Columns中,我们可以对Machine表的内容作出编辑和修改,作为最终数据导入的格式。

Datastage抽取/处理多层目录中XML(2)
▲图27.编辑数据库表

  

${PageNumber}

  3.3.4 Transfomer 设置

  右键打开Transfomer Stage的属性设置界面,如下

  数据目标库的各个列呈红色位于右侧,而左边的各个列为空白。我们可以双击空白处,添加数据来源。数据来源的方式有很多,其中Job Parameter即我们预先定义好的变量。Input Columns则来自于上一个Stage,即XML_Input的输出,我们可以选择XML_Input输出的某个列作为数据来源。此外,还有内置函数(Function)以及内置宏(DS Macro)可以对源数据作变换处理。 例如我们使用Job Parameter获取到的日期文件夹名,是字符串形式,yymmdd格式。如2012年3月15日的文件夹名是120315,而这种格式的数据与DB2数据库中的标准日期格式是不一致的。DB2中的标准日期(Dtae)格式是YYYY-MM-DD,年月日之间必须有短横线连接,且年份必须是4位,数据格式应该是2个短横线连接的10位字符串。我们在Transformer中借助Datastage提供的内置函数和宏,将原字符串拆散后重新组合,并添加“20”前缀和短横线,就变成了符合DB2日期格式的标准形式,能够正确地导入到DB2数据库表相应的列中。关于Transformer中的各种内置函数和宏,在Datastage的Server Job帮助文件中专门有大幅篇幅介绍用法。此处仅仅展示了在日期转换方面这些函数和宏起到的巨大作用,免去了编写字符串处理程序的麻烦。

Datastage抽取/处理多层目录中XML(2)
▲图28.在Transformer中对目标数据表和数据来源作出设置

  当某一行有数据来源且格式正确时,该行会变为黑色。如图:

Datastage抽取/处理多层目录中XML(2)
▲图29.设置完成后的Transformer

  我们对每一个数据目标表的列规定了其数据来源以及转换规则,这样Transformer Stage的设置就完成了。

  3.4 Server Job的编译执行和数据验证

  当每个Stage的设置都完成之后,我们编译这个Job。如果有错误,则我们可以看到窗口提示错误信息并且可以根据信息提示定位问题所在。

Datastage抽取/处理多层目录中XML(2)
▲图30.Job编译出错后的提示信息

  如果没有错误,编译成功,我们就可以执行这个job。

 

Datastage抽取/处理多层目录中XML(2)
▲图31.Job编译成功的提示信息

  如果数据流箭头变成绿色,证明数据在stage之间成功传输了,我们可以到最终的数据目标容器去验证结果是否正确。如图,代表数据流的箭头依次变为绿色:

Datastage抽取/处理多层目录中XML(2)
▲图32.Job成功执行后数据流箭头变为绿色

  打开数据导入的目标数据库表,我们看到,一条2012年3月15日的机器Machine1的信息成功的导入了数据库表中,成为了数据库表中的一行记录。并且还将其路径中包含的机器名信息和日期信息都获取了。

Datastage抽取/处理多层目录中XML(2)
▲图33.成功导入了一条数据

 

${PageNumber}

  3.5 以Server Job为基础构建更为复杂的Sequence Job

  以上我们已经完成了一个基本的Server Job,将指定的某个文件夹中的某个文件数据导入到数据库表中成为一条数据,并且获取了该文件路径中附带的机器名和日期信息。

  下面我们就可以利用Datastage对Job的复用,完成对2层文件目录下所有类似文件的ETL操作。

  我们新建一个Sequence Job——Machine_loop,其结构如图:

Datastage抽取/处理多层目录中XML(2)
▲图34.带有循环结构的Sequence Job

  这个Sequence Job的核心部分是利用一个循环结构对之前我们完成的Server Job进行循环调用,其循环的参数信息由这个Job的前半部分操作提供。

  在Squence Job的Stage窗口中选择EndLoop Activity构建循环结构:

Datastage抽取/处理多层目录中XML(2)
▲图35.位于Sequence Job Stage窗口中的EndLoop Activity Stage

  循环参数设置如下:

Datastage抽取/处理多层目录中XML(2)
▲图36.循环结构参数设置

  该循环从1开始,进行步长为1的循环。循环上限是一个变量uv.count。该变量描述的是某个日期文件夹下的机器文件夹的个数。

  在该循环之前的操作中,我们利用Datastage自带的Hash文件及相关函数的处理功能,将利用Windows系统命令获取到的某日期下的机器目录名写入了一个Hash文件,并且获取到了该Hash文件的行数,即uv.count变量的值。

  在ExecCommand Activity Stage中运行windows系统命令将某日期下的机器目录名写入txt文件:

Datastage抽取/处理多层目录中XML(2)
▲图37.ExecCommand Activity Stage中的命令脚本

  使用Job Activity Stage可以在Sequenc Job中调用其它的Job。我们在TXT2HASH这个Job Activity Stage中调用了一个从TXT文件内容转换到HASH文件的简单Server Job,将存有机器目录名的TXT文件转换成为了HASH文件。该Server Job的结构如图:

Datastage抽取/处理多层目录中XML(2)
▲图38.从TXT文件转换为HASH文件的Server Job结构

${PageNumber}

  通过Hash Stage自带的函数,我们就能够根据Hash文件中每一行的Key值获取该行的内容。因此,在循环中,我们在XML2DB这个Job Activity Stage中调用我们之前创建并编译运行通过的Server Job——Machine_1。

Datastage抽取/处理多层目录中XML(2)
▲图39.循环内结构调用之前设计的Server Job

  这个调用Job的Stage参数设置如下:

Datastage抽取/处理多层目录中XML(2)
▲图40.Job Activity Stage中调用Job的设置

  我们在这个循环中调用的Job名称就是之前我们设计好的Machine_1 Server Job。其中的2个参数,dir_machine,即机器名,来自于该步循环读出的Hash文件对应行的内容。而另外一个参数,dir_date,则来自于变量传入,即从外层Job获取到的日期目录名。

  通过这个循环结构调用Server Job和Hash文件的配合,我们就实现了将某个日期下的所有机器文件夹中的XML数据遍历导入指定数据库的操作。

  接下来,我们在外层再设计一个Sequence Job——Date_loop, 其结构和我们设计的内存循环Sequence Job基本相同。只是Hash文件中保存的是所有的日期目录名,调用的Job改为了我们刚刚完成的上一个Squence Job——Machine_loop。通过调用Machine_loop Job,以及通过循环读取Hash文件每一行的日期目录名,对所有日期文件夹进行遍历,我们就完成了对2层目录下所有日期、所有机器XML数据的导入。

Datastage抽取/处理多层目录中XML(2)
▲图41.外层Sequence Job循环结构对日期目录作遍历操作

  至此,我们从构建一个简单的单任务Server Job,到最终完成双层循环的复杂Sequence Job,实现了我们预期达到的ETL目标。

  1. 总结与思考

  通过实际操作完成对2层目录结构下的XML文件数据抽取和处理的ETL JOB设计,我们初窥Datastage工具的强大与优越性。

  它的优点展示得非常明显,可视化操作,封装好的多种类型Stage,丰富的内置函数,简单的调试过程,以及易用性和非常好的复用性。我们可以从简单的Job开始设计,从完成基础的任务开始,一步一步,通过组合和调用Job,完成更为复杂的ETL工作。

  对于很多的Job和Stage,我们只需要略微修改它们的参数,就可以将其用来完成类似的工作。例如,本例中,如果我们修改Folder Stage的通配符(Wildcard),如从“whatami”改为另外某个字符串“HARDDISK”,那么这个Job就会从文件夹中寻找文件名包含“HARDDISK”的文件,通过对表定义作出修改,那么这个Job就能够用来完成对另一个结构,名字都不同的XML文件的数据抽取和处理工作。还有,本例中我们只展示了对2层目录结构中的XML文件作ETL处理,如果是3层,4层乃至更多层的目录结构呢?我们依然可以按照这种对Job的调用方式,去构建更多层循环的ETL Job,完成对这种复杂目录结构下XML文件的ETL工作。这正是Datastage的强大所在。

  Datastage还为我们提供了内容丰富的帮助手册。在Datastage安装目录下的Documentation文件夹中,我们能够找到各种语言版本的Datastage手册,可以很好地帮助我们学习使用Datastage。本文中列出的Stage和函数在手册中也均有详尽的介绍。

  通过使用Datastge,能够大大提升我们在某些ETL方面工作的效率。因此,在遇到类似问题的时候,我们不妨考虑使用Datastage这个强大的ETL工具。本文仅作为抛砖引玉,为大家学习使用Datagstage工具提供一定的参考和Job开发思路方面的借鉴。

0
相关文章