【IT168评论】引言——数据抽取和处理的需求
随着数据分析和商业智能(BI)需求的快速增长,我们越来越多的需要将数据从多种形式的数据源、多种格式的数据文件中提取出来,并进行处理,获得我们真正想要的,易于利用的核心数据。
大致来说,底层的数据获取方式可以分为两大类,一类是由专门的开发人员去开发相应的程序,有针对性地从数据源中提取数据并且进行处理,还有一类是利用现有的一些软件工具,去达到数据抽取和处理的目的。IBM的Datastage产品正是针对这种需求而诞生的软件工具。
在银行,电信等行业,由于数据量庞大,且历史数据的分析价值较高,因此这种对大量数据的ETL(Extraction-Transformation-Loading,数据抽取,转换和加载)需求十分迫切,Datastage在这些行业的BI(Business Intelligence,商业智能)项目中得到了广泛应用,在数据ETL方面节省了大量的人力物力,能够大规模的加快开发进度,并取得了十分令人满意的效果。
1. Datastage简介
相对于传统的开发底层的数据抽取和处理的程序代码,Datastage具有适应面广,可重用,可视化开发,自带多种函数工具包,可以按预设时间表自动运行数据抽取和处理任务等多项优势。在很多情况下,应用Datastage作为数据抽取和处理的工具,可以大大缩短开发的时间以及减少开发人员的工作量。
我们可以看看使用Datastage工具和传统开发方法的对比:
表1. Datastage工具和传统开发方法的比较
Datastage | 开发程序 |
需要学习掌握Datastage 使用 | 可以直接开始进行开发 |
有可以直接利用的丰富Stage和工具包 | 需要作针对性的开发 |
与各类数据源的接口齐全 | 需要作针对性的开发 |
可视化开发,数据处理流程结构清晰 | 内嵌于代码结构中,处理流程不够清晰 |
可重用已开发好的功能部件,直接调用job | 可重用,但没有datastage方便 |
可调试,能看到是哪一个job,哪一个stage,哪一条数据出了问题 | 可调试,但由于程序的复杂性,难以定位问题所在 |
很强大的Schedule Task功能 | 需要另外开发该部分的功能 |
受到已有开发模式,已有模块的限制 | 比较灵活 |
利用已有Stage,开发周期短,测试任务相对较少 | 程序开发周期长,测试工作任务繁重 |
易于维护和移植 | 难以维护,需要对程序代码作升级或修改 |
因此,在项目数据规模较大,数据抽取和处理的需求紧迫,以及需要对数据抽取和处理部分功能作持续的维护和升级时,采用Datastage工具能够帮我们大大简化并且高质量地完成这方面的工作。
Datastage由以下几个部分构成:
Designer(设计器),是Datastage的核心部分,在Designer中,用户可以在可视化的环境中设计调试ETL Job,从数据源中获取数据,进行数据转换工作并将数据导入指定的目标容器。
Director(控制器),能够控制ETL Job的启动,停止,并监控Job的运行状况,通过Job执行的log记录可以定位问题所在。并且Director还能够制定Job执行的Schedule,让Job在预定的时间自动执行。
Manager(管理器),管理Repository中的数据定义,以及Datastage相关数据的导入导出。(在Datastage8.1之后的版本中集成进了Designer中)
Administrator(服务器端管理器),管理Datastage服务器,包括License管理,项目管理和权限管理。
Repository(存储库),储存Datastage的后台数据,如数据库表等等。Datastage自带默认的DB2数据库作为存储库,也可以配置使用其他类型的数据库。
${PageNumber}2. 面临的具体问题及期望实现的目标
下面我们描述一下我们遇到的一个具体问题,以此为例,在下文中介绍如何运用Datastage来解决类似的问题。
我们通过某些监控工具收集到了一些机器的数据,将数据存放在XML(Extensible Markup Language,可扩展标记语言)文件当中。作为一种专门为存储数据内容而设计的格式,XML文件可以简单而高效地存储各种格式的数据,并且可以用自定义的标签来定义数据,而且能够很方便地在很多应用程序中进行读写。因此XML文件就成为了存储这些监控工具获得的数据的非常好的文件格式。
这些XML文件是分散存在于2层目录结构中的。内层目录是按机器名区别的,而外层目录是按日期区别的。例如:我们打开Data文件夹,其中存放的是不同日期的文件夹,而打开其中某一个日期的文件夹,其中存放的是不同机器的文件夹。每个机器的文件夹里面都有在该日期获取的多个XML文件。
目录结构如图所示:
我们期望获得文件夹中的XML数据,以及获知这些XML数据来自于哪一台机器,哪一个日期。这就需要我们不仅仅要从XML文件中抽取数据,还要从外面两层文件夹的路径名中获得信息。例如我们想获得Data\120315\Machine1\A.xml中的数据,同时还要从文件路径中获知该数据是2012年3月15日那天Machine1这台机器的信息。类似A.xml这样的XML文件很多,它们都分散存在于两层目录的文件系统中。我们需要将这些数据完整而没有遗漏地导入到我们预先设计好的数据库中,且XML中的tag标记数据应和数据库中的表列一一对应。
我们期望的ETL操作应该达到以下几点目标:
1. 将XML文件中的数据以预期的格式装载到数据库表中。
2. 将文件路径信息中包含的机器名和日期信息也作为数据装载到数据库表中,并和该路径下的XML数据相关联。
3. 一些不标准的格式,如路径中的120315并不是标准的数据库中的日期格式,需要将其进行转换之后再导入数据库。
4. 需要对2层目录作循环遍历操作,以确保所有文件夹下的XML文件数据没有遗漏地导入了数据库表。
3. 使用Datastage设计Job实现数据抽取和处理
3.1 Job类型介绍
我们将在Datastage的Designer中进行ETL Job的设计和调试。
Datastage Designer的特点是设计可视化,有很多功能性的stage可以直接利用以达成我们的目标。并且已完成的Job可以被重用,也可将几个Job组合起来形成更为复杂的ETL Job。
在Datastage中Job的类型有3种:Server Job,Sequence Job和Parallel Job。
其中Server Job是最为常用的job 类型,一般用来完成单一目的,无需协作的ETL任务。
Squence Job用于Job间的协作控制,它可以调用其它job,使job组合完成复杂的任务。
Parallel Job用于完成一些需要并行执行的job。
3.2 Job的创建和预备工作
3.2.1 Job的创建
我们设计Job的原则是将最终希望完成的目标分解,首先完成基础、简单的ETL工作,再利用Datastage的Job可重用,可组合特性,完成更为复杂的任务。
最基本的任务当然就是将一个固定路径中的一个XML文件中的数据装载到我们指定的数据库表中。这个任务可以由一个Server Job完成。
我们利用到的stage如图所示:
这些Stage我们可以从Stage窗口中直接拖到设计窗口中,并右键点击这些Stage,将它们用数据流箭头连接起来。
我们可以看见在Stage窗口中有很多类型的Stage供我们选择。
其中Folder Stage是File类型Stage的一种,用来指定文件路径,进行文件导入。
XML_Input Stage则是用来解析XML文件数据内容,进行XML数据抽取的Stage,位于Real Time类型下。
Transformer Stage是一个使用频率非常高的stage,属于Processing类型。它指定源数据和目标数据之间的对应关系,并且在Transformer Stage中,我们可以使用Datastage提供的函数,宏等等工具进行数据的转换和清洗工作。
DB2_UDB_API Stage则是属于对数据库进行操作的一个stage,隶属于DB2 UDB类型Stage。Datastage提供对多种类型数据库的支持,除了DB2之外,对Oracle,MS SQL server, informix等多种主流数据库都有操作接口。同时也支持ODBC等其他类型的数据库连接方式。以下是Datastage在数据库连接操作方面的一些stage类型:
使用这4个stage作为部件,我们就能构建起一个具备完整功能的ETL job。
${PageNumber}
3.2.2 Job的预备工作
在对这些Stage进行配置之前,我们还需要要对数据做一些预定义操作。在Datastage中,我们是通过表定义来明确数据格式的。Datastage中对于各种数据的抽取,转换和加载,实际上都是对这些数据的表定义作操作。例如在本例中,我们工作的实质就是将XML数据和数据库中的表都转化为Datastage中的表定义,并将数据在这2个表中进行转换和加载操作。因此,我们在Job开始前要建立XML文件和数据库表在Datastage中的表定义,以便在它们之间建立对应关系。
首先针对XML文件内容,引入相应的XML表定义:
在菜单中选择Import->Table Definitions->XML Table Definitions
在打开的XML Meta Data Importer窗口中,我们可以选择将要进行表定义操作的XML文件。例如,我们选择在120315文件夹下的Machine1文件夹下的A.XML文件。Datastage会读取该XML文件,并根据XML文件中的Tag标记,列出可能作为表属性的各个列定义。我们可以打钩选择我们需要的数据定义,如下图,我们选择了以下的属性作为表定义的列名。以这个定义好的表为框架,Datastage就可以将其它类似的XML文件内容按照我们预定义的格式读入。
在本例中,我们导入的XML表定义中包含cpu_bits、serial、ml、os等列,将serial列作为主键。
${PageNumber}同样,我们还需要对最终数据导入的数据库表作表定义操作。选择Import->Table Definitions->Plug-in Meta Data Definitions,
选择DSDB2类型
需要我们输入数据库的名称以及实例账户和密码。这里数据库的名称是TEST1,选中Tables,我们就能看到TEST1数据库中所有的表。
我们选中将要把数据导入的目标表:MACHINE,点击import按钮,MACHINE表的表结构就被导入了Datastage的表定义中。
${PageNumber}
我们可以到\Table Definitions\PlugIn\DSDB2路径下找到Machine表,并可对表的列名和属性作一些修改。
由于考虑到XML文件是位于2层目录结构下的,其路径名可能会变化,因此我们设置2个变量来确定两层的具体目录名称。点击视图上方的Job Properties按钮
在出现的变量定义窗口中定义如下变量:
至此,我们完成了预备工作,接下来就对每个stage作具体的设置和调整,使其完成我们预期的ETL目标。