级别: 初级 Branislav Barnak, 软件架构师, IBM Amir Bar-or, 高级架构师和经理, IBM Cynthia M. Saracco, 高级解决方案架构师, IBM Paul Stanley, 高级架构师, IBM
2009 年 10 月 26 日 学习如何使用 IBM® InfoSphere™ DataStage 8.1 和 DB2® 9.5 pureXML® 将业务关键型 XML 数据集成到您的数据仓库中。这个共包含 2 个部分的 系列文章 分步介绍如何将 pureXML 作为 InfoSphere DataStage 作业的源和目标数据源。
XML 无处不在,这是不争的事实。在表示关键业务数据方面,基于 Web 的应用程序、面向服务架构(SOA)和特定于行业的数据转换格式都严重依赖于 XML。XML 使用的增长促使许多公司探索如何将 XML 运营数据集成到自己的数据仓库和业务智能环境中。
本系列文章将讲解如何结合使用 IBM DB2 pureXML 和 InfoSphere DataStage 管理 XML 运营数据、根据需要转换 XML 数据,以及填充关系数据仓库或混合型的关系/XML 数据仓库。(为了保持简洁,这个系列文章将使用 “pureXML” 和 “DataStage” 代替完整的产品名称)。本系列文章提供的分步说明将带领您经历两个常见的集成场景。
在第一篇文章中,探索如何使用 pureXML 数据作为输入构建包含关系数据和 XML 数据的数据仓库。另外,还将了解使用 DataStage DB2 Connector 的重要技巧。在 本系列 的第二篇文章中,您将了解如何将平面文件数据转换成 XML 数据,并通过 pureXML 将其储存到数据仓库中。
关键 DataStage 和 pureXML 技术简介
如果您不熟悉 DataStage 或 pureXML,下面几个小节将进行简单介绍。不过,具备数据仓库、ETL(提取-转换-装载)技术和 XML 知识对理解本系列文章有帮助。
DataStage 概述
IBM InfoSphere DataStage 使公司能够从各种源提取和转换数据,并将数据装载到数据仓库中。DataStage 内置支持多处理器硬件,这使它能够提供很强的可伸缩性和高效处理大量数据。 DataStage 通过各种 “连接器” 支持广泛的源和目标数据格式,包括流行的 IBM 和 OEM 数据库管理系统、ODBC 数据源、第三方应用程序、流行的文件格式,以及消息队列软件和 Web 服务生成的实时消息。
DataStage 通过许多软件组件提供本文介绍的功能和其他一些功能。本系列文章介绍的场景仅用到它提供的功能的一小部分。本文的场景使用了一个非常重要的功能,即使用 DataStage Designer 构造 ETL 作业。每个作业都包含多个 “阶段(stage)”,并且每个阶段都执行一个特定的任务。例如,这些任务包括从数据源读取信息、使用内置函数转换输入数据和转换数据的类型等等。本文的例子定义了与 DB2 Connector、XML 操作和各种处理操作有关的阶段。对于本系列文章的场景而言,有两种 DataStage 技术是至关重要的:DB2 Connector 和 XML Pack 2.0。本文随后将对此进行介绍。
使用 DataStage Designer 创建和编译了作业之后,就可以使用 DataStage Director 执行作业。
DataStage DB2 Connector
本文的所有 DB2 数据库访问都依赖于 DB2 Connector。这是 InfoSphere Information Server 中的主要 DB2 连接性选项,并且基于 Common Connector Framework。这个连接器包含旧有 DataStage 连接性组件中的大部分特性,并且提供改进的特性和性能。
在 Information Server 8.1 中,DB2 Connector 作为一个独立的连接器补丁安装提供。它支持从本地或远程连接到 DB2 9.1 和 9.5 服务器。(在未来的 Information Server 发布版中将支持 DB2 9.7)。这个连接器需要使用 DB2 Client 9.1 Fix Pack 6(或更新版本)或 DB2 9.5 Fix Pack 3(或更新版本)。
DB2 Connector 的关键特性包括:
- 支持 XML 和 LOB(大对象)数据类型。有两个可用转换机制:通过值传递(内联)和通过引用传递。当以内联的方式传递 LOB 或 XML 数据时,数据的最大大小由 DataStage 引擎决定。当以引用的方式传递数据时,下游(或接收)阶段通过直接调用源连接器使用引用获取数据。该方法的不足之处是,LOB 数据仅能从一个连接器移动到另一个连接器,而不能在作业中进行转换(因为链接仅传递了引用)。当读或写 XML 列时,连接器要求
ArraySize 属性设置为 1。
- 能够执行
SELECT、INSERT、UPDATE 和 DELETE 等 SQL 语句和 SQL 语句组合、用户定义的 SQL 语句以及整体加载语句。
- 支持并行(多进程)执行。
- 支持 DB2 DPF (Database Partitioning Feature)。该连接器能够以并行或序列模式处理分区数据库。当在并行模式下运行时,将为每个 DB2 分区分配一个独立的 DataStage 进程。连接器能够并行读写或并行装载分区数据库。
- 当与 Distributed Transaction Stage (DTS) 结合使用时,它支持通过 XA(两阶段提交)事务进行有保障数据提交。DTS 提供一种机制,支持将多个 DB2 数据库作为一个 XA 事务的一部分更新。注意,DTS 作为 DataStage 8.1 的独立补丁。
- 支持通过 DataStage Designer 中包含的 Common Connector Import Wizard 导入元数据。
DB2 Connector 使用上下文
可以在源、目标或查找上下文中使用连接器。在这个系列文章中,您将在源和目标上下文中使用 DB2 Connector。
源上下文是指连接器阶段有一个输出链接。在该上下文中,连接器用于获取数据。
目标上下文是指连接器阶段有一个输入链接,这意味着数据被传递到连接器。在该上下文中,连接器用于执行 INSERT、UPDATE、DELETE、UPSERT(INSERT/UPDATE/DELETE 语句组合)、用户定义的 SQL 语句以及整体加载语句。
查找上下文是指连接器与查找阶段结合使用。在该上下文中,可以将数据传递到连接器或从中获取数据。在这种场景中,连接器执行带有 WHERE 子句的 SELECT 语句。
DB2 Connector XML 支持
本系列文章的场景主要关注 DB2 Connector 对 XML 数据的支持。因此,有必要更多地了解 DB2 Connector 中的 XML 支持。
XML 列的 DataStage 表示
DataStage 8.1 使用 NVarChar 或 LongNVarChar 数据类型表示 XML 数据。在元数据导入期间,用户可以选择 XML 列的类型。这两种数据类型的区别是,表示为 NVarChar 列的 XML 列用于以内联的方式转换数据,并且受 DataStage 引擎大小的限制,而 LongNVarChar 数据类型将 XML 列作为大对象(LOB)处理,并且允许通过引用传递数据。
连接器支持:
- XQueries
- 嵌入 SQL 的 XQueries
- SQL/XML 查询
- 使用 XML 列的更新或删除操作
源上下文:读取 XML 列
连接器能够读取整个 XML 文档或 XML 片段。XML 片段的值可以是有序的,也可以是分散的。当使用了 XQuery 时,连接器将不支持通过引用传递 XML 结果,因为构造 LOB 定位器比较困难。
下面的例子(清单 1-6)包含几个连接器支持的常见 SQL 查询和 XQuery。这些查询基于流行的 DB2 pureXML 入门文章中的样例(参见 参考资料 部分了解详细信息)。注意,DB2 Connector 对 SQL、SQL/XML 和 XQuery 的支持并不局限于这些例子。
清单 1. 使用简单的 SQL 获取整个 XML 文档
select xml_col from table
|
如果 DataStage 作业中的 XML 列用 LongVarChar 数据类型表示,那么连接器将给用户提供一个选项,让他们选择以引用还是内联的方式将该列传递到下一个阶段。
清单 2. 使用 XQuery 获取整个 XML 文档
xquery db2-fn:xmlcolumn('TABLE.COL_NAME')
|
注意:清单 2 的结果不能以引用的方式传递。
清单 3. 使用 XQuery 提取 XML 文档片段
xquery db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="10011"
or Address/city="San Jose"]/Address
|
注意:清单 3 的结果不能以引用的方式传递。
清单 4. 使用 XQuery FLWOR 表达式提取 XML 文档片段
xquery
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="10011" or $y/Address/city="San Jose"
return $y/email[1]/text()
|
注意:清单 4 的结果不能以引用的方式传递。
清单 5. 使用嵌入有 SQL 的 XQuery 提取整个 XML 文档
xquery db2-fn:sqlquery('select xml_col from table')
|
注意:清单 5 的结果不能以引用的方式传递。
清单 6. 使用 SQL/XML 查询提取 XML 文档片段
select xmlquery('$c/Client/Address'
passing contactinfo as "c")
from clients
where status = 'Gold'
and xmlexists('$c/Client/email' passing contactinfo as "c")
|
在清单 6 中,连接器可以以内联或引用的方式传递结果。
表达式列的前缀
当连接器执行查询时,它试图将查询返回的列名与在连接器阶段的输出链接中指定的列名匹配。然而,XQuery 列名是用一个数字表示的。连接器为这些数字添加一个字符串前缀,该字符串可以通过设置连接器源上下文属性 Prefix for Expression Columns 进行配置。默认的前缀是 EXPR。添加前缀之后 XQuery 列名将变成 EXPR1 和 EXPR2 等。这很重要,因为连接器将在链接列列表中查找这些列。
目标上下文:插入/更新/删除 XML 列
如前所述,DB2 Connector 能够作为输入数据的目标,并且可以将输入数据写到适当的 DB2 数据库中。下面的例子(清单 7-11)展示了 DB2 Connector 如何在 XML 列中插入、更新或删除信息。
这些例子中有一部分使用了 DataStage 保留关键字 ORCHESTRATE,该关键字用于将参数传递到语句。在 ORCHESTRATE 关键字之后指定的列名必须和与适当的 DataStage 链接相关联的结果集中的一个列匹配。
清单 7. 插入 XML 列
insert into table values(ORCHESTRATE.col1)
|
列名 col1 表明该列已在输入链接中指定。这个列的类型可以是 NVarChar 或 LongNVarChar,并且可以以内联或引用的方式传递。
清单 8. 使用简单的 SQL 更新语句更新整个 XML 文档
update clients set
contactinfo=( xmlparse(document ‘<email>newemail@someplace.com </email> ' ) )
where id = 3227
|
清单 9. 使用参数更新 XML 文档值的一部分
update xmlcustomer
set info = xmlquery('copy $new := $INFO
modify do replace value of $new/customerinfo/phone with $z
return $new' passing cast(ORCHESTRATE.col2 as varchar(15)) as "z")
where cid = ORCHESTRATE.col1
|
清单 9 使用了两个参数。col2 值替换了 XML 文档中现有的 /customerinfo/phone 数据;col1 值限制受更新影响的行。
清单 10. 根据内部 XML 数据管理器删除 XML 记录
delete from clients
where xmlexists ('$c/Client/Address[zip="95116"]'
passing clients.contactinfo as "c")
|
清单 11. 使用参数删除 XML 记录
delete from clients
where xmlexists ('$c/Client/Address[zip=$z]'
passing clients.contactinfo as "c", cast(ORCHESTRATE.col2 as varchar(15)) as z)
|
清单 11 使用 col2 值作为参数根据一个 XML 元素(zip 或客户端地址的邮政编码元素)限制 DELETE 操作。
DataStage XML Pack
本系列文章基于 DataStage XML Pack 2.0 为两个场景提供关键功能。这个 XML Pack 包含 3 个阶段:XML Input、XML Output 和 XML Transformer。本系列的场景使用 XML Input 和 XML Output 阶段,但不用到基于 XSLT 的 XML Transformer 阶段。
XML Input 阶段
XML Input 将 XML 数据转换成 “平面” 关系表。通过 XML Input 可以:
- 使用标准的 XPath 提取数据
- 使用 XML Schemas 和可选地验证 XML 数据
- 支持使用样式表进行复杂转换
- 支持使用不同数据集的多个输出链接
- 处理错误
图 1 展示了由 XML Input 阶段执行的一个简单转换:
图 1. XML Input
阶段将结构化 XML 数据转换成 “平面” 表
XML Output 阶段
XML Output 将表数据(比如关系表)转换成 XML 结构化数据。使用 XML Output 可以:
- 使用一部分 XPath 表达式生成 XML
- 从相同的输入生成多个文档
- 支持 XML 名称空间
- 以多种方式配置 XML 文档生成,比如每个输入行生成一个文档
- 在磁盘上生成输入文档或通过输出链接生成输入文档
- 处理错误
图 2 展示了了 XML Output 执行的一个简单转换:
图 2. XML Output 阶段将 “平面” 表结构转换成 XML 结构化数据
DB2 pureXML 概述
DB2 为公司提供一个常见的应用程序编程界面和一个数据库管理平台,帮助它们以表的结构或 XML 结构对数据进行建模。图 3 展示了 DB2 如何支持公司管理 XML 消息和文档以及传统的关系数据。使用 pureXML 之后,就不再需要将业务关键型 XML 数据映射为关系格式。XML 数据可以按照原来的层次结构格式完整地保存。应用程序能够轻松地访问所需的 XML 数据以及集成 XML 和关系数据。
图 3. DB2 架构提供关系数据和 XML 数据管理支持
本系列文章中的场景依赖于 DB2 的 pureXML 功能,它能够更好地按原样存储 XML 格式的数据,并且支持用 SQL 或 XQuery 语言查询 XML 数据。
样例开发和运行时环境
为了创建本系列文章描述的样例场景,我们使用以下软件:
- Information Server 8.1,它包含 DataStage Designer 和
DataStage Director组件。此外,我们还安装 DataStage 8.1 DB2 Connector,它包含在一个称为 “Connectors Rollup Patch 1” 的 DataStage 8.1 补丁中。因为有一个场景使用到 Transformer Stage,所以我们还安装了必要的 C++ 编译器(我们使用 Microsoft Visual Studio .NET 2003)。
- DB2 9.5 Enterprise Server Edition。
DataStage 和 DB2 都安装在同一个 Windows 系统中。
样例运营数据包含关于金融产品的信息。该数据来自开源 Transaction Processing over XML (TPOX) 基准测试。我们特意使用表示客户帐户及其财产(或投资)的信息的数据。学习这些场景时,您将更多地了解运营数据和数据仓库设计。(要更多地了解 TPOX,请参见 参考资料 部分)。
使用 pureXML 作为数据仓库的输入
本文描述的场景使用存储在 DB2 pureXML 中的 XML 数据作为 ETL 作业的输入。如 图 4 所示,您将让 DataStage 提取存储在一个 DB2 XML 列中的数据,然后将该数据映射到 DB2 数据仓库的两个表中。这两个表的其中之一仅包含传统的关系列,而另一个包含关系列和一个 XML 列。
图 4. 存储在 DB2 pureXML 中作为数据仓库的输入的运营数据
这个数据模型代表一个典型的场景,其中 XML 数据部分被 “分割” 成关系结构。这些数据部分是业务用户频繁分析和查询的数据。许多业务智能工具都支持关系结构,因此将频繁查询的 XML 数据分割成关系列是很有效的。不过,业务需求可能会随着时间变化,因此管理员很难确定应该创建哪个关系列。在数据仓库中维护完整的 XML 数据允许用户直接访问以前没有转换成关系格式的重要业务数据。
为了让本文的样例场景保持简单,我使用一个简单的 DB2 数据库(名为 “TPOX”)来存储运营数据和仓库数据。当然,在生产环境中,运营数据和仓库数据应该存储在独立的数据库中,并且这些数据库通常位于不同的服务器上。
由于我们使用 DB2 管理运营数据和仓库数据,所以我们应该能够选择使用内置的 DB2 技术执行许多 ETL 工作。但是,将这个任务转移给 DataStage 能够将对 DB2 操作的影响降至最低,这是在生产环境中需要实现的常见目标。另外,除了在 DB2 中可以找到的特性之外,DataStage 还提供许多转换和清理特性。最后,许多公司需要使用来自异类数据源的数据填充数据仓库,而 DataStage 提供的关键服务能够帮助它们完成该任务。这些功能已有完整详细的描述,本文不再专门讨论。
设计概述
本文的样例场景将 XML 运营数据储存在 TPOXADMIN.ACCOUNT 表中,该表充当 DataStage 的源表。ACCOUNT 表包含一个关系列(ID)和一个 XML 列(INFO)。清单 12 显示创建该表有多简单:
清单 12. 创建源 ACCOUNT 表的 SQL
create table tpoxadmin.account(id int, info xml)
|
INFO 包含关于该帐户的详细信息,包括标题、开户日期、有效余额、资产组合和其他信息。清单 13 显示了储存在 ACCOUNT 表中的 XML 文档的一部分。本文附带的 DB2 脚本包含完整的 XML 帐户记录(见 下载)。
清单 13. 存储在 ACCOUNT 表中的 XML 文档的一部分
<Account id="804130877" xmlns="http://tpox-benchmark.com/custacc">
<Category>6</Category>
<AccountTitle>Mrs Shailey Lapidot EUR</AccountTitle>
<ShortTitle>Lapidot EUR</ShortTitle>
<Mnemonic>LapidotEUR</Mnemonic>
<Currency>EUR</Currency>
<CurrencyMarket>3</CurrencyMarket>
<OpeningDate>1999-02-20</OpeningDate>
<AccountOfficer>Soraya Lagarias</AccountOfficer>
<LastUpdate>2004-02-10T22:33:58</LastUpdate>
<Balance>
<OnlineActualBal>896882</OnlineActualBal>
<OnlineClearedBal>337676</OnlineClearedBal>
<WorkingBalance>430147</WorkingBalance>
</Balance>
. . .
<Holdings>
<Position>
<Symbol>ZION</Symbol>
<Name>Zions Bancorporation</Name>
<Type>Stock</Type>
<Quantity>1927.719</Quantity>
</Position>
. . .
</Holdings>
. . .
</Account>
|
为了简化测试过程,存储目标数据的数据库也配置为 TPOX。来自 TPOXADMIN.ACCOUNT 的 INFO 列的源信息将映射到两个表中 —— 包含关于所有帐户的信息的 DWADMIN.ACCT 表,包含关于特定帐户的各种投资(资产组合)的 DWADMIN.HOLDINGS 表。清单 14 显示了如何定义这些表:
清单 14. 目标数据仓库表的定义
-- DWADMIN.ACCT contains general information about accounts.
create table dwadmin.acct (
id int primary key not null,
title varchar(100),
currency char(3),
workingbalance int,
totalholdings int,
holdingtypes int,
officer varchar(50),
datechanged date,
timechanged time,
fullrecord xml
)
-- DWADMIN.HOLDINGS tracks specific investments (holdings) for a given account
create table dwadmin.holdings (
id int references dwadmin.acct on delete cascade,
symbol varchar(10),
type varchar(25),
quantity decimal(12,2)
)
|
要理解 XML 源数据(在 TPOXADMIN.ACCOUNT 的 INFO 列中)如何映射到数据仓库表的各个列,请查看 表 1。(两个数据仓库表的 ID 列都从操作的 ID 列的值填充)。
表 1. 针对数据仓库表的每个列的 XML 源数据
| DWADMIN.ACCT | DWADMIN.HOLDINGS |
|---|
| 列名 | 数据源(XPATH 或……) | 列名 | 数据源(XPATH 表达式) |
|---|
| title | /Account/AccountTitle | symbol | /Account/Holdings/Position/Symbol | | currency | /Account/Currency | type | /Account/Holdings/Position/Type | | workingbalance | /Account/WorkingBalance | quantity | /Account/Holdings/Position/Quantity | | officer | /Account/AccountOffice |
|
| | datachanged | extract from /Account/LastUpdated |
|
| | timechanged | extract from /Account/LastUpdated |
|
| | fullrecord | entire XML document as originally stored in DB2 source table |
|
|
如您所料,可以通过几种方式为该场景构建 DataStage 作业。本文采用递增开发方法。尤其是初始的步骤,它们将指导您创建整个 DataStage 作业的一部分,该部分提取和转换数据,并将数据装载到 DWADMIN.ACCT 表。在这个部分完成并经过测试之后,本文将带领您改进该作业,以提取和转换 XML 数据,然后将其装载到 DWADMIN.HOLDINGS 表。但是,您首先需要创建一个支持这个场景的合适的 DB2 表。
准备 DB2 数据库环境
本文的 下载 部分包含一个脚本,它创建了必要的运营(源)表和数据仓库(目标)表。它还使用样例 XML 帐户信息填充了运营表。下载 并解压缩 DSsetup.zip 文件,然后打开 DB2 命令窗口并发出以下命令:
清单 15. 调用系列文章附带的 DB2 脚本
注意:这个脚本专门用于支持运行 Windows 的 DB2 9.5 服务器。
创建并行作业并描述其内容
首先,使用占位符为各种需要包含的阶段(工作任务)定义一个新的 DataStage 并行作业。接下来,编辑每个阶段以指定恰当的属性来成功执行作业。
- 启动 DataStage Designer。
- 要创建新的并行作业,请右键单击 Repository 面板的 Jobs 文件夹,然后选择 New > Parallel
job。
- 向该并行作业添加两个 DB2 Connector 阶段。一个连接器将表示 TPOXADMIN.ACCOUNT 源表,另一个表示 DWADMIN.ACCT 目标表。
- 在 Palette 面板选择 Database 选项卡。
- 将 DB2 Connector 阶段拖放到该并行作业上。
- 重复该步骤创建第二个 DB2 Connector 阶段。
- 将这两个连接器放到并行作业画布的另一面。
- 向该作业添加一个 XML Input 阶段。(这个阶段将把 XML 结构的数据转换成表结构数据)。
- 在 Palette 目标上选择 Real Time 选项卡。
- 找到 XML Input 阶段并将其拖放到并行作业上。
- 将图标放置在第一个 DB2 Connector 阶段的附近。
- 向该作业添加一个 Transformer 阶段。(这个阶段将把一个 XML 元素值分割成两个值,用于填充目标表中的两个不同的列)。
- 在 Palette 面板选择 Processing 选项卡。
- 找到 Transformer 阶段并将该图标拖放到并行作业面板。
- 将图标放在 XML Input 阶段和最终的 DB2 Connector 之间。
- 将两个阶段链接起来。
- 要将第一个 DB2 Connector 与 XML Input 链接起来,请按住鼠标右键,单击 DB2 Connector,然后将鼠标拖动到 XML Input 阶段。在这两个阶段之间将出现一个箭头。
- 将 XML Input 链接到 Transformer 阶段。
- 将 Transformer 阶段链接到最后的 DB2 Connector。
- 如果想要的话,您还可以使用标准的 DataStage 实用工具对每个阶段和链接使用描述性名称定制作业。(可以从 参考资料 部分获得 DataStage 教程和文档的链接)。
- 检查您的并行作业设计是否类似于 图 5,它显示了链接在一起的各个阶段,如步骤 6 所述:
图 5. 集成场景的第一部分的 DataStage 作业骨架
(查看图 5 的 大图)。
- 从主工具栏单击 File > Save 保存工作,然后为它指定一个任意的名称。
现在,您的 DataStage 作业的第一部分已经具有一个并行作业骨架。
导入表定义
DB2 TPOX 数据库已经包含源和目标表,因此您需要将关于这些表的元数据导入到 DataStage。
- 从主工具栏选择 Import > Table
Definitions > Start Connector Import Wizard。
- 将出现一个新的窗口 “Connector metadata import – Connector selection”。选择 DB2 Connector (Variant 9.1),然后单击 Next。
- 输入连接的适当细节,包括实例类型(DB2)、数据库名(TPOX)以及有效的用 ID 和密码。
- 在该窗口的右上角单击 Test connection 选项,检查是否已经连接到 DB2 TPOX 数据库。
- 如果连接成功,单击 Next 然后单击 OK。
- 对于数据源位置,使用默认值。这些值包括 DB2 的主机名和 TPOX(DB2)的数据库名。
- 单击 Next。
- 从 Filter 下拉列表选择 TPOXADMIN 模式,检查是否选择 include tables 选项,然后单击 Next。
- 从这个模式的可用表列表中选择 ACCOUNT 表。
- 其他所有选项都不要选择,包括 “XML Columns as LOBs” 选项。您的 DataStage 需要处理和转换 XML 数据,因此它将 XML 数据当作字符串数据(而不是未结构化的大对象或 LOB)。
- 检查是否已经可以导入 TPOXADMIN.ACCOUNT 表,然后单击 Import。
- 将弹出一个窗口,提示您为导入元数据选择一个文件夹。选择 Table Definitions 然后单击 OK。
- 重复以上步骤导入两个数据仓库目标表。
- 在步骤 8 选择 DWADMIN 模式而不是 TPOXADMIN 模式。
- 在步骤 9 选择 ACCT 和 HOLDINGS 表。(您在开始时仅用到 DWADMIN.ACCT 表定义,但现在一起导入 DWADMIN.HOLDINGS 表比较节省时间)。
- 为了确认已经为所有必要的表成功导入了元数据,在右上角的 Repository 中展开 Table Definitions 文件夹,确认出现关于 TPOXADMIN.ACCOUNT、DWADMIN.ACCT 和 DWADMIN.HOLDINGS 的条目。
- 保存工作。
现在,您可以开始编辑工作的每个阶段。
编辑 DB2 源表阶段
TPOXADMIN.ACCOUNT 表包含数据仓库所需的运营信息。必须编辑源 DB2 Connector 的属性,以反映关于这个输入表的恰当信息。
- 双击表示输入源的 DB2 Connector。
- 这时将出现一个窗口。在 Properties 选项卡指定恰当的连接信息。这些信息包括实例类型(DB2)、数据库名(TPOX)和有效的用户 ID 和密码,如 图 6 所示:
图 6.为 DB2 源表设置属性
- 在该面板的右上角单击 Test,检查您是否已经成功连接到数据库。
- 在 Properties 选项卡上向下滚动到 Usage 部分,然后指定以下设置(见 图 6):
- Generate SQL:Yes
- Table name:TPOXADMIN.ACCOUNT
- Array size:1
- 在 Usage 行的右侧单击 View Data,检查是否能够成功查询该表,然后单击 OK 保存设置。
- 单击 Columns 选项卡,然后在该面板的底部选择 Load。
- 将出现一个显示表定义的窗口。选择 TPOXADMIN.ACCOUNT 表,然后单击 OK。
- 将出现一个显示表的列的窗口。使用默认值,其中所有列都是选中的。(注意 INFO 列,它在 DB2 中创建为一个 XML 列,在这里使用 SQL 类型 NVarChar,表示这是 Unicode 字符串。这很好)。
- 单击 OK。
- 为 INFO 列指定一个适当的长度。对于样例数据,5000 字节的长度已经足够。
- 单击 OK。
- 保存工作。
现在,源表的 DB2 Connector 阶段已经准备就绪。在下一个步骤中,您将定制表示数据仓库目标表的 DB2 Connector。
编辑 DB2 目标表阶段
DWADMIN.ACCT 表是需要从输入源填充的两个数据仓库表之一。如前所述,这个表包含几个存储财务帐户的特定信息的关系列,以及一个以 XML 格式存储完整帐户数据的 pureXML 列。必须编辑目标 DB2 Connector 阶段的属性,以反映这个表的恰当信息。
- 要打开表示目标表的 DB2 Connector,双击它的图标。
- 在 Properties 选项卡指定适当的连接性息。这些信息包括实例类型(DB2)、数据库名(TPOX)和有效的用户 ID 和密码。
- 测试是否能够成功连接到数据库。
- 在 Properties 选项卡的 Usage 部分,指定以下设置,如 图 7 所示:
- Write mode:Insert
- Generate SQL:Yes
- Table name:DWADMIN.ACCT
- Array size:1
- Table action:Truncate
图 7. 为两个 DB2 目标表之一设置属性
- 单击 View Data 检查是否能够成功查询该表。(第一次运行作业时,该表是空的)。
- 单击 OK 保存这些设置。
- 单击 Columns 选项卡,并选择 Load。
- 选择 DWADMIN.ACCT 表,然后单击 OK。
- 使用默认值,其中这个表的所有列都是选中的。(注意 FULLRECORD 列,它在 DB2 中作为 XML 列创建,在这里的 SQL 类型为 NVarChar)。
- 单击 OK。
- 为 FULLRECORD 列指定适当的长度。对于样例数据,5000 字节的长度已经足够。
- 单击 OK。
- 保存工作。
定义了 DB2 源和目标阶段之后,应该关注处理数据的阶段了。
编辑 XML Input 阶段
您需要定制 XML Input 阶段,以从 TPOXADMIN.ACCOUNT 表的 INFO 列提取 XML 数据并生成表结果集,这个结果集最终用于填充 DWADMIN.ACCT 表。
- 要打开 XML Input 阶段,双击它的图标。
- 单击 Input 选项卡。
- 这时会出现第二组选项卡。单击 XML Source 子选项卡(如果需要的话)。
- 指定 XML 源列。使用下拉选项卡选择 INFO 列。
- 指定 XML 文档(而不是 URL/File 路径)作为列内容。
- 单击 Column 子选项卡。
- 检查是否列出了 ID 和 INFO 列。
- 将 INFO 列的数据类型设置为 VarBinary,并将列长度设置为 5000 字节。(使用 VarBinary 使 XML Input 阶段能够用原生 UTF-8 格式处理数据,从而避免不必要的字符集转换)。
- 单击主 Output 选项卡。
- 这时将出现一组新的选项卡。单击 Transformation
Settings 子选项卡。
- 检查是否选择 Repetition element required 设置。设置它表明您将要从一个包含 XML 的记录提取多个记录。XML Input 阶段将遍历重复元素,并为每个重复的元素生成一个输出记录。在下面的步骤中,您将了解如何识别重复元素的路径。
- 选择 include namespace declaration 复选框。
- XML 源数据包含一个名称空间,因此您在这里需要声明它。输入:
xmlns:ns= "http://tpox-benchmark.com/custacc" |
- 单击 Columns 子选项卡,然后选择 Load。
- 将出现一个表定义列表。选择 DWADMIN.ACCT 表。
- 使用默认值装载所有列。
- 检查是否勾选了 Ensure all Char columns use Unicode,然后单击 OK。
- 修改这个作业阶段的输出结构,如下所示(以和 图 8 保持一致):
- 为 FULLRECORD 列指定其长度为 5000 字节。
- 将 TIMECHANGED 列的数据类型更改为 NVarChar,并指定其长度为 20 字节。将数据当作字符串处理能够利用某些内置的 DataStage 转换功能,稍后将对此进行介绍。
- 指定 DataStage 用于从输入 XML 数据提取信息的恰当 XPATH 表达式。对每个列执行这个操作,但 ID 列除外(它从源 TPOXADMIN.ACCOUNT 表的关系列提取而来)。恰当的描述设置包括:
- TITLE: /ns:Account/ns:AccountTitle/text()
- CURRENCY: /ns:Account/ns:Currency/text()
- WORKINGBALANCE:
/ns:Account/ns:Balance/ns:WorkingBalance/text()
- OFFICER: /ns:Account/ns:AccountOfficer/text()
- DATECHANGED: /ns:Account/ns:LastUpdate/text()
- TIMECHANGED: /ns:Account/ns:LastUpdate/text()
- FULLRECORD: /ns:Account
- 将 TITLE 列标识为 key。为此,将 TITLE 的 Key 更改为 Yes。这将指示 DataStage 使用这个 XML 元素值作为重复元素标识符。每次发生 ns:AccountTitle 时,这个阶段都生成一个输出记录。换句话说,它将为每个 Account 生成一个记录,因为每个帐户都包含一个
AccountTitle 元素。在这个场景中,其他元素也可以充当这个角色,包括 CURRENCY、WORKINGBALANCE 和 OFFICER 列,因为它们都是 Account 元素的必要元素。为了简便,我们选择 TITLE 作为主键列。
图 8. XML Input 阶段的输出结果的列定义
(查看图 8 的 大图)。
注意:带有 Unicode 扩展的 VarChar 类型等同于 DB2 Connector 的 NVarChar 类型。
- 单击 OK 并保存工作。
现在,您已经让 XML Input 阶段能够从 DB2 pureXML 列提取数据,并将数据映射到主要是关系结构的 DB2 目标数据仓库表。接下来,您将定制 Transformer 阶段,以在将数据装载到目标表之前根据需要修改它。
编辑 Transformer 阶段
Transformer 阶段需要从包含时间戳数据的输入字符串提取时间信息,以准确地填充目标 DWADMIN.ACCT 表中的 TIMECHANGED 列。DataStage 为操作日期/时间数据和执行数据类型转换等提供大量内置函数。您需要编辑 Transformer 阶段以调用正确的函数进行数据类型转换。
- 要打开 Transformer 阶段,双击它的图标。
- 单击工具栏的 Column Auto-Match 图标,指示 DataStage 根据名称在输入和输出链接之间自动映射列。(您在 “编辑 XML Input 阶段” 小节为这个阶段的输入链接定义了结果集。并且在 “编辑 DB2 目标表阶段” 小节为这个阶段的输出链接定义了结果集)。
- 单击 OK。
- 修改输出链接的 TIMECHANGED 列的 Derivation 设置,以在需要时转换数据。记住,输入字符串包含一个带有日期和时间信息的完整时间戳,您希望仅使用一个时间值填充 DB2 目标表中的 TIMECHANGED 列。
- 突出显示合适的 Derivation 设置,并选择 Edit Derivation。
- 这时将出现一个空白的面板。使用内置向导选择正确的转换函数调用,或输入以下代码:
TimestampToTime( StringToTimestamp(AccountOverview.TIMECHANGED,
"%yyyy-%mm-%ddT%hh:%nn:%ss")) |
您可能会感到奇怪。其实内部函数调用将输入字符串转换成使用特定格式编译的时间戳。外部函数接受这个时间戳,并将其转换成一个时间值。要了解这些函数或 Transformer 阶段的详细信息,请查看 参考资料 部分。
- 确保您的转换类似于 图 9,它演示了输入和输出链接之间的映射(在步骤 2 中生成),以及您在步骤 4 中编辑的派生(derivation):
图 9. 修改后的 Transformer 阶段的属性
(查看图 9 的 大图)。
- 单击 OK。
现在,您已经对初始的 DataStage 作业进行了必要的修改。接下来,您可以编译和测试它了。
编译和测试作业
遵循标准的 DataStage 流程编译、验证和运行您的作业。如果需要的话,可以从 参考资料 部分找到 DataStage 文档的链接。以下提供一个快速步骤:
- 按下 F7 键或从工具栏选择 Compile 图标。确保编译没有出现错误。
- 按下 Ctrl+F5 键或从工具栏选择 Run 图标。
- 将 Warnings 设置为 no limit,然后单击 Run。
- DataStage 将尝试执行作业。启动 DataStage 和 QualityStage Director 检查作业的结果。
- 如果需要的话,切换到 Status 页面并突出显示您的作业。为此,选择 View > Status,或在工具栏中选择 Status 图标。
- 切换到 Log 页面查看作业执行的详细情况。为此,选择 View > Log,或从工具栏单击 Log 图标。尽管可能出现警告消息,作业应该能够成功执行。
在这里,您可以使用标准的 DB2 工具查看目标表中的数据。如果您喜欢的话,还可以通过以下步骤从 DataStage Designer 查看数据:
- 双击表示目标表的 DB2 Connector。
- 单击 View Data 链接显示目标表中的数据。
添加更多阶段来填充最终的数据仓库表
为了完成这个场景,您需要从 XML Input 源提取适当的数据,并将其装载到 DWADMIN.HOLDINGS 表。为此,需要向现有的作业增加了新的阶段。
- 从选项板的 Processing 部分选择一个 Copy 阶段,并将其放置到现有的 XML Input 阶段下面。
- 在选项板上,将一个新的 DB2 Connector 阶段放置到 Copy 阶段的右边。
- 将 XML Input 阶段链接到新的 Copy 阶段,然后将新的 Copy 阶段链接到新的 DB2 Connector 阶段。
- 如果喜欢的话,还可以使用描述性更强的名称重命名新的链接和阶段。
- 查看您的作业设计是否类似于 图 10,它显示了链接在一起的不同阶段,如步骤 3 所述:
图 10. 为本场景修改 DataStage 作业
(查看图 10 的 大图)。
编辑新的 DB2 Connector 阶段:
- 指定适当的连接性息,包括实例类型(DB2)、数据库名(TPOX)和有效的用户 ID 和密码。
- 测试连接。
- 指定适当的使用信息:
- Write Mode:Insert
- Generate SQL:Yes
- Table name:DWADMIN.HOLDINGS
- Table action:Truncate
- Array Size:1
- 选择 View Data 查看指定的项是否有效。
- 单击 Column 选项卡。
- 从表定义为 DWADMIN.HOLDINGS 加载信息。导入所有列。
- 将 ID 列的 Key 值设置为 Yes。
- 指定 DataStage 用于从输入 XML 数据提取信息的 XPATH 表达式(见 图 11)。对每个列执行该操作,ID 列除外。适合的描述设置包括:
- SYMBOL:
/ns:Account/ns:Holdings/ns:Position/ns:Symbol/text()
- TYPE:
/ns:Account/ns:Holdings/ns:Position/ns:Type/text()
- QUANTITY:
/ns:Account/ns:Holdings/ns:Position/ns:Quantity/text()
图 11. 为 DWADMIN.HOLDINGS 表编辑 DB2 Connector 的列值
(查看图 11 的 大图)。
编辑现有的 XML Input 阶段:
- 单击 Output 选项卡,并使用 Output Name 框下的下拉菜单标识需要修改的 DataStage 链接。(在 图 10 中,HoldingInfo 是适当的链接,因为它控制从 XML Input 阶段到刚添加到作业中的 Copy 阶段的数据流)。
- 单击 Transformation Settings 选项卡。
- 检查是否选中了 Repetition element required 设置。
- 勾选 include namespace declaration 复选框。
- 在空白的方框中输入以下 XML 名称空间定义:
xmlns:ns="http://tpox-benchmark.com/custacc" |
- 单击 Columns 子选项卡。
- 为 DWADMIN.HOLDINGS 表装载信息。选择所有列。
- 指定 DataStage 用于从 输入 XML 数据提取信息的 XPath 表达式(见 图 12)。对每个列执行该操作,但 ID 列除外。适当的描述设置包括:
- SYMBOL:
/ns:Account/ns:Holdings/ns:Position/ns:Symbol/text()
- TYPE:
/ns:Account/ns:Holdings/ns:Position/ns:Type/text()
- QUANTITY:
/ns:Account/ns:Holdings/ns:Position/ns:Quantity/text()
图 12. 从 XML Input 阶段到新的 Copy 阶段的输出的列定义
(查看图 12 的 大图)。
- 将 SYMBOL 列的 Key 值设置为 Yes。这导致每次出现
Symbol 元素时该阶段都生成一个输出记录。因为 Symbol 出现在每个 Position 元素中,所以该阶段为每个 Position 元素生成一个记录。
- 单击 OK。
编辑新的 Copy 阶段。(这个阶段在 XML Input 和 DB2 Connector 阶段之间传递信息,它们的 Key 值都与不同的含义相关联。XML Input 阶段使用 Key 列标识重复元素,这决定如何生成 XML 数据。在上一个小节编辑 XML Input 阶段时,您在步骤 3 和步骤 9 中所做的工作标识重复元素的 Key 值。当然,DB2 Connector 使用 key 来标识作为数据库主键的列。Copy 阶段允许在这些阶段之间传递数据,而不引入任何操作冲突,因为每个阶段处理键值的方式都不一样。为此,它的输入和输出链接将不同的列标识为主键)。
- 从 Output 选项卡选择 Mappings。
- 单击 Auto-Match 并选择 OK。
- 如果喜欢的话,可以查看输入和输出链接上的列的 Key 定义。
- 单击 Input 选项卡,然后单击 Columns 子选项卡。
- 检查 SYMBOL 列是否标识为 Key。
- 单击 Output 选项卡,然后单击 Columns 子选项卡。
- 检查 ID 列是否标识为 Key。
- 单击 OK 完成对这个阶段的编辑。
测试修改后的作业:
- 如果还没有保存作业的话,请保存。
- 编译作业。
- 确保没有任何错误。
- 运行作业。
- 使用 DataStage Director 查看日志,并确定作业是否成功运行。
- 或者,您也可以在目标 DB2 阶段的阶段编辑器中选择 View Data 查看目标表中的数据。
结束语
XML 作为数据交换格式日益盛行,这促使数据架构师和管理员考虑采取什么方法将业务关键型 XML 数据集成到数据仓库。在共包含两个部分的 系列文章 的第 1 部分中,您学习了 IBM InfoSphere DataStage 如何提取和转换 DB2 pureXML 管理的数据。另外,您还探索了 DataStage 如何将数据装载到两个表中:一个使用传统的 SQL 数据类型,另外一个使用了关系列和 XML 列。
本系列文章的第 2 部分将探索另一个重要场景:使用 DataStage 从平面文件读取数据,然后将数据转换成 XML 格式,最后将 XML 数据装载到包含带有一个 DB2 pureXML 列的表的数据仓库中。
致谢
衷心感谢 Stewart Hanna、Susan Malaika 和 Ernie Ostic 对本文进行审查和评论。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 样例脚本和数据 | DSsetup.zip | 141KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
作者简介  | 
|  | Branislav Barnak 是位于福罗里达州 Boca Raton 市的 IBM 公司的软件架构师。他负责研究 IBM InfoSphere DataStage 连接性并且关注 DB2、WebSphere MQ 和大型机数据存储系统等 IBM 技术。Branislav 开发连接技术已经超过 10 年。他现在致力于研究几个与数据库和消息产品(比如 Oracle、PeopleSoft、Teradata、DB2 和 WebSphere MQ 等)连接的连接性框架。他拥有塞尔维亚 University of Belgrade 的电子工程学士学位。 |
 | 
|  | Amir Bar-or 马萨诸塞州实验室的 Enterprise Information Management Group 的高级架构师和经理。他先后在惠普实验室和 IBM SWG 工作,从事数据库研究超过 10 年。目前,他带领团队开发 DataStage 未来的 XML 功能。 |
 | 
|  | Cynthia M. Saracco 是 IBM 硅谷实验室的高级解决方案架构师,她的专长是新兴技术和数据库管理。她具有 23 年的软件开发经验,撰写了 3 本书籍并发表超过 60 篇技术论文,拥有 7 项专利。 |
 | 
|  | Paul Stanley 是位于福罗里达州 Boca Raton 市的 Enterprise Information Management Group 的高级架构师。他为 WebSphere Transformation Extender and InfoSphere DataStage 架构和开发连接性组件超过 12 年。 |
对本文的评价
|