使用 IBM InfoSphere DataStage 8.5 中的 XML 转换功能,第 2 部分: 了解程序集

这个 “使用 IBM InfoSphere DataStage 8.5 中的 XML 转换功能” 系列的第 1 部分介绍了程序集的概念,在 IBM® InfoSphere™ DataStage® 中对分层数据执行丰富功能和转换的一系列步骤。第 2 部分对程序集概念提供了更深入的理解,文中描述了程序集数据模型、映射表的原理,以及在程序集内 XSLT 的使用。此外还为一些复杂场景提供性能准则。

Amir Bar-or, 高级架构师和经理, IBM

Amir Bar-or 的照片Amir Bar-or 是马萨诸塞实验室企业信息管理组的一名高级架构师和管理者。他在数据库研究和开发方面拥有 10 多年经验,他先在 HP 实验室做了一名研究员,然后进入 IBM SWG。现在,他在领导 DataStage 未来 XML 功能的开发。



Shruti Choudhary, 高级质量保证工程师, IBM

Shruti Choudhary 的照片Shruti Choudhary 是 IBM 印度实验室的高级质量保证工程师。她具有 DataStage XML Stage 的丰富经验,现在她正在从事 WebServices Stage 的工作。她具有两年多的质量保证方面经验。



2011 年 6 月 23 日

InfoSphere DataStage 的新 XML 功能使用最先进的设计环境提供强大的分层转换。在本系列的 使用 IBM InfoSphere DataStage 8.5 中的 XML 转换功能,第 1 部分:使用 DataStage XML Stage 转换 XML 中,我们探讨了几个导入架构和解析 XML 文件或编写 XML 文件的简单场景。

本文重点介绍支持创建更复杂转换和处理复杂 XML 架构的程序集概念。在描述概念之后,我们介绍程序集的一些常被忽略的更强大的功能,通过示例说明这些功能。

XML stage 文档 提供介绍性信息,以及一些展示如何使用每个转换步骤的简单示例。该文档是用于学习工具和执行简单解析和转换的第一信息源。对于本文大部分内容,我们假定您熟悉 XML stage 的基本概念且理解 XML 架构。

简单的解析和合成场景通常是直观的,且一般不需要深入理解程序集概念或 XML 架构。

程序集

程序集分层数据模型

程序集数据模型用于描述贯穿程序集步骤的分层数据。程序集数据模型是对 XML 架构模型的简化。原始数据模型与 XML 架构定义的原始类型一样(参见 参考资料 更多地了解 XML 架构规范)。但是在描述复杂数据时,一些 XML 架构概念经过简化,不过仍然能够保存来自 XML 架构的所有信息。

一些主要的简化或不同之处是:

  • 单项概念— 程序集数据模型中的一个项目 描述一个与原始类型对应的原始值。原始类型的元素和属性都由一个项目以及 DataStage 链接的列表示。
  • 单一列表概念— 程序集数据模型中的一个列表 描述数据中的一个新层面。列表可以与一个 DataStage 链接或一个重复的 XML 元素(例如,maxOccur > 1 的一个元素)或 XML 架构中的一个 xs:List 相对应。程序集列表不表示实际值;但是一个重复的 XML 元素可以有一个原始类型。因此在程序集中,这个元素对应于两个节点:一个用于存放实例(名称与元素名一样)数的列表和列表内一个名为 text() 的子项。
  • 单组概念— 一个 是层次结构中的一个节点,惟一目的是创建一个对信息分类或封装信息的结构。它不描述维度或值。一个组可以对应于一个 maxOccurs="1" 的具有一个序列或选项内容类型的复杂元素;序列和选项都由单一组捕获。选项概念仅允许在任何给定实例中显示一个子项,可以通过将子组的可选择性设置为 true 并添加一个名为 “choice discriminator” 的新子项来捕获选项概念。choice discriminator 值将是在该选项实例中使用的子组的名称。
  • 元素派生— 呈现为包含关系。程序集数据模型通过创建存在于数据实例中的包含关系来捕获元素派生。例如,如果一个子元素继承自父元素,子元素的架构树将包含一个基于其类型的父元素组。该组捕获可包含在子实例中的所有父信息。

在导入一个 XML 架构时,它被翻译成这个简化的模型。转换步骤会使用上述简化的概念。例如,在聚合步骤中,聚合一个 double 类型的属性与聚合一个 double 类型的元素是相同的。对原始 XML 架构概念敏感的惟一步骤是 XML 分析器和编写器步骤。由于能够将信息保存在 XML 架构中,这些步骤能够重新创建 XML 架构概念并按需依附它们。

程序集计算模型

程序集计算模型非常不同于 DataStage 作业计算模型。不同之处在于,有不同的受支持数据模型。虽然 DataStage 作业设计很适合于关系型数据,但程序集很适合于分层数据。程序集中的每一步都将整个分层输入传递到输出,另外一个额外的扩充分支被添加到输出中,包含步骤计算的结果。在 DataStage 中,每个链接携带一个关系,因此如果一个 stage 对多个关系执行转换,两个输入链接需要附加到 stage,且输出行为是相似的。

但是在程序集中,单一输入可以带有多个列表,因此所有步骤有一个可能包含多个列表的输入和输出。与 DataStage stages 类似的是,程序集步骤总是迭代输入列表。与 DataStage stages 不同的是,程序集步骤可以迭代可位于分层输入任何层次的列表,且生成的输出包含在它们迭代的输入列表中。

扩充分支总是包含在当前步骤遍历的顶级列表中。Assembly Editor 为每个步骤呈现其输入和输出树,并强调当前步骤计算过的扩充分支,所以它区别于步骤的原始输入。这个强大的数据模型将转换描述简化成一系列步骤,而非一个直接的图形。

程序集的输入和输出步骤有一个突出的作用:它们将关系型数据转换成分层数据,再将分层数据转换到关系型数据。描述关系的每个链接转化成分层数据中的一个列表。每个列转化成列表中的一个项目。整个输入树根植于一个名为 top 的列表中。top 输入列表中的单一项目包含与输入链接对应的所有列表。在普通的批次执行中,仅有一个 top 项目存在,且它包含流入程序集的所有数据。但是,当使用了 DataStage waves(例如,实时作业)时,每个请求或 wave 产生一个新的 top 项目。

将 waves 表示成程序集中的一个列表可以让同一程序集在启用 wave 的作业和普通批作业之间共享。例如,对于编写器步骤,映射到文档集列表的列表确定创建的 XML 文件的数量。因此,如果 top 列表被映射到文档集列表,会为每个 top 列表项目创建一个文件。在普通的批作业中,编写器步骤在该设置中仅创建一个文件。但是在启用 wave 的作业中,编写器步骤为每个 wave 创建一个文件。


映射表

映射表是一种常见的构造,允许您将一个分层结构映射到另一个中。可通过几个步骤来使用它:XML 编写器,合并,输出。不同于其他并行映射工具,映射表不提供将任何分层结构映射到另一结构的完整映射功能。为使输入适应于输出结构,映射表用作最后一步。映射表不允许您更改输入结构中列表的维数来匹配输出结构。您不能执行一个联接或合并或任何其他组合操作并映射到一个目标列表。如果需要这样的组合操作,必须在映射表步骤之前在转换步骤中执行。例如,如果编写器步骤需要编写一个由另外两个列表联接而来的列表,用户首先需要在编写器步骤之前添加一个联接步骤,然后执行映射。这将使用户将复杂的转换分解成一系列简单转换步骤,最终对映射表中的数据有一个简单的调整。

映射表允许用户执行标量映射,也就是要执行没有组合语义且不更改结构维度的重构。映射表还允许用户将源类型转化成目标类型,或定义常量映射 来将常量设置为目标架构中的项目。

映射表遵循一套易于遵循的简单准则:

  • 目标映射— 用户将目标映射到源,反之则不然。源可以是目标的一个超集。
  • 自上而下映射— 映射始于目标的根,然后往下进行。一个节点可以在其父节点没有被映射或具有映射错误的情况下被映射。
  • 列表对列表,项目对项目— 如果可以将源类型转化为目标类型,一个列表可以映射到另一列表,一个项目可以映射到另一项目。
  • 组没有被映射— 组仅在创建结构。由于已经定义了目标结构,因而无需映射组。
  • 明确的映射— 要映射一个目标项目,确定值时绝对不能含糊。换言之,对于给定的源列表,到源项目的路径必须提供一个惟一的值。不支持不是直接始源的另一个源列表项的路径,因为可能有多个值匹配该路径,而到一个始源列表的路径在遵循包含关系时总是提供单一值。
图 1. XML 编写器步骤中的映射表
屏幕截图显示 XML 编写器步骤中的映射表

Assembly Editor 强制执行这些规则。如果 Assembly Editor 不允许您将一个源节点映射到一个特定目标,这是因为它不遵守上述规则。要查明原因,您可以使用映射建议中的 More 选项,并选择树中的源节点。一条错误消息会显示,描述为何不能映射节点。


部分解析和验证

有时候您只对 XML 文档某部分感兴趣或您希望保持这部分不解析并将其作为字符串向下传递。XML 解析器步骤允许您配置解析,并决定应当使用 Chunk 操作保持文档的哪部分不予解析。

这表示,如果文档有一部分会造成验证问题,通过为文档该部分分块,我们可以确保它被作为单串数据看待且绕过所有验证检查。

在我们的示例场景中,用户希望通过一个 XML 文件或平面文件编写特定于员工的信息。XML 文件包含有关公司部门和该部门员工的信息。部门信息预期总是会符合架构,但员工信息可能不完全符合架构(例如,所有员工可能没有一个中间名,这是一个必填字段,或者出生日期可能不符合 XML 日期格式。) 因此,员工的 XML 数据需要经过最低验证,同时部门信息必须经过严格验证。

为了达到这个要求,可以对员工列表进行分块。Chunk 选项位于分析器步骤的文档根窗口中。要对员工列表进行分块,右键单击列表并选择 Chunk

图 2. 分析器步骤的文档根窗口中的 Chunk 选项
屏幕截图显示分析器步骤的 Document Root 窗口中的 Chunk 选项

注意,当执行了 Chunk 操作时,输出树包含一个类型为 XML 的项目。该节点包含未解析的 XML 块。

图 3. XML 分析器步骤的输出选项卡
屏幕截图显示 Chunk 操作之后 XML 分析器步骤的输出选项卡

现在确保在 XML 分析器步骤的 Validation 窗口中选中 Strict Validation,如下图所示。

图 4. XML 分析器步骤的验证窗口
屏幕显示 XML 分析器步骤的 Validation 窗口

第二个分析器的源文档将是第一个分析器的分块元素,我们现在可以运用较弱的验证规则,这将仅适用于分块元素:Employees:

  1. 在 XML_Parser1 Step 中,在 XML Source 窗口中,选择 String set 选项并从下拉菜单中选择分块项目,如下图所示。
图 5. 第二个分析器步骤的 XML 源窗口
屏幕截图显示第二个分析器步骤的 XML 源窗口
  1. XML 源被定义之后,架构立即能够在文档根窗口中得到自动填充。架构被自动填充,是因为 Assembly Editor 理解作为信息源的员工项目的类型。
图 6. 第二个分析器步骤的文档根窗口
第二个分析器步骤的 Document Root 窗口
  1. 因为较弱的验证需要应用于文档的员工部分,确保在 XML_Parser1 Step 的 Validation 窗口中选中 Minimal Validation

第二个分析器的输出需要被映射到输出步骤中的输出链接来完成场景。

注意,通过操作架构和使用 <xs:any> 元素(而非使用 Chunk 操作)可以实现相同的功能。当一个带有 <xs:any> 的架构用于分析器步骤中时,与 <xs:any> 对应的所有元素都没有被解析,且被存储为单一 XML 字符串。与上述情况的不同之处在于,为了在随后的分析器步骤中解析该内容,用户将需要从与 <xs:any> 内容匹配的库中选择一个新文档根类型。


Group To List 和 List To Group 映射

这两种映射在每个步骤的 Output 选项卡上都有提供,同时还有其他映射,比如 DropRenameGroup To List 映射仅可应用于一个组节点(参见数据模型部分的定义),它将组转化为一个单一尺寸列表。List To Group 映射仅可用于列表,它通过仅保留列表的第一个项目将列表转化成一个组。

下面两个场景展示何时使用映射以及它们为何重要。

List To Group

有一个 XML 文件包含公司中员工的信息。每个员工有两个地址:办公地址和家庭住址。在该场景中,XML stage 从输入 XML 文件中仅过滤出家庭住址,然后将整个员工信息映射到单一输出顺序文件。List To Group 映射帮助将整个员工信息映射到输出步骤中的单一列表。

在该作业中,程序集包含 XML 分析器、转换和输出步骤。

  1. XML_Parser 步骤配置:在 Document Root 窗口中,必须从架构库管理器中选择根元素信息。在 XML 分析器步骤的文档根中选择 EMP.xsd 架构之前应当将其导入到架构库管理器中。

架构中的地址列表包含一个员工的家庭住址和办公地址。“address_type” 项包含 “O” 和 “H”,分别表示办公地址和家庭住址。要仅过滤出家庭住址,使用转换步骤,其中仅过滤出 address_type="H" 的项目。

  1. 转换步骤配置
    1. List To Categorize 选项定义需要过滤的列表。在该场景中,必须在地址列表上完成过滤。因此,必须选择 information/employees/address 作为要分类的列表。
    2. scope/target 列表应当是 information/employees。
    3. 要指定过滤标准,需要定义一个目标。要添加一个目标,单击 Add Target 并键入新的目标名称 Home_address
    4. 现在如下所述创建过滤表达式:
      • Filter Field = 从下拉列表中选择 Information/employees/address/address_type。
      • Function = Select Compare.
      • 选择 Constant 复选框并在文本框中选择 “H” 值。
图 7. 转换步骤中的配置窗口
屏幕截图显示转换步骤中的配置窗口

在输出步骤中,需要将员工信息映射到输出顺序文件。输出顺序文件包含的列有 first_name、middle_name、last_name、emp_id、city、state、country、zip_code 和 address_type。在将员工列表映射到输出列表之后,只有 first_name、middle_name、last_name 和 emp_id 项目可映射到顺序文件中的列,因为这些字段位于员工列表内。

属于地址信息的其他列不能映射,是因为它们位于另一个列表下。Assembly Editor 不允许您创建会引起歧义的映射。Home_address 列表可以包含多个地址。程序集不会知道要使用哪些地址值,因此它禁止映射。

为了能够映射已过滤的地址信息,Home_address 下的项目需要直接位于员工列表下面。这可以通过将 Home_address 转化为一个组来实现。在将一个列表转化成一个组时,只有列表的第一个项目被保留。但是,我们知道 Home_address 列表仅有一个地址,因为原始地址列表仅包含一个带 “H.” 的地址。因此,在转化为组时没有信息损失。

从列表到组的转换只能在一个步骤的 Output 选项卡中完成。因此在该作业中,映射需要在转换步骤的 Output 选项卡中完成。这将是转换步骤的最后配置。

  1. 右键单击 Switch:filtered 节点下的 Home_address 列表并选择 List To Group
图 8. 转换步骤的 Output 选项卡中的 List To Group 选项
屏幕显示转换步骤的 Output 选项卡中的 List To Group 选项

list Home_address 被转化为一个组,如上图所示。最后,输出步骤现在可以完全被映射了,如下面的映射表所示。

图 9. 输出步骤中的映射表
图像显示输出步骤中的映射表

Group To List

在该场景中,需要将 XML 数据从分析器中的一个架构结构映射到编写器中的另一个架构结构。分析器步骤中的架构包含员工信息,其中每个员工有一个地址。编写器步骤中的架构也有员工信息,其中每个员工可以有多个地址。Group To List 映射帮助用户将分析器中的架构映射到编写器步骤中的架构。

  1. 在 XML 分析器步骤中,在文档根窗口中,必须从架构库管理器中选择根元素 Information。在 XML 分析器步骤的文档根中选择 employee.xsd 架构之前应当将其导入到架构库管理器中。
图 10. XML 分析器步骤中的文档根窗口
图像显示 XML_Parser 步骤中的 Document Root 窗口
  1. 在 XML 编写器步骤中,在文档根窗口中,必须从架构库管理器中选择根元素 Employee。在 XML 编写器步骤的文档根中选择 employee1.xsd 架构之前应当将其导入到架构库管理器中。
图 11. XML 编写器步骤中的文档库窗口
图像显示 XML 编写器步骤中的文档根窗口

如上述屏幕截图所示,架构的结构在 XML 分析器和 XML 编写器步骤中是不同的。在 XML 分析器步骤中,项目地址是一个组,但在 XML 编写器步骤中,项目地址是一个列表。为了能够将分析器中的架构结构映射到编写器中,必须将 Group To List 映射应用到 XML 分析器步骤的 Output 选项卡中的项目地址。

右键单击 XML_Parser:result 节点下的地址列表并选择 Group To List

图 12. XML 分析器步骤的 Output 选项卡中的 Group To List 选项
图像显示 XML 分析器步骤的 Output 选项卡中的 Group To List 选项

然后项目地址被转化为一个列表,可以在 XML 编写器步骤中完成映射了,如下图所示。

图 13. XML 编写器步骤中的映射表
屏幕截图显示 XML 编写器步骤中的映射表

在解析中合并 XSLT 样式表

Assembly Editor 不需要用户创建一个 XSLT 样式表,它提供一种更直观的方式来描述转换。但是在有些情况下用户希望首先向数据运用一个 XSLT 样式表,解析它并将它映射到程序集中。对于大文档通常不建议这么做,因为当前的 XSLT 技术需要文档装入内存,且它将削弱程序集解析任何大小的文档的优势。

然而程序集可以首先执行 XSLT 转换,且它会读取 XSLT 的结果,如同它是原始文件的内容。文档根元素应当反映 XSLT 的结果,而非原始文档。

必须将 XSLT 样式表粘贴到分析器步骤的 XML 源窗口的 Enable Filtering 区域中。要启用 Enable Filtering 选项,首先需要定义 XML 源并选择 Enable Filtering 旁边的复选框。在 Enable Filtering 选项下方的区域中会看到默认的 XSLT 样式表。

图 14. XML 分析器步骤的 Enable Filtering 窗口中的默认 XSLT
图像显示 XML 分析器步骤的 Enable Filtering 窗口中的默认 XSLT

然后用户可以用其各自的样式表替换默认样式表。

图 15. XML 分析器步骤的 Enable Filtering 窗口中的 XSLT
屏幕截图显示 XML 分析器步骤的 Enable Filtering 窗口中的 XSLT

注意在 XML 分析器文档根窗口中,root 被选定为根元素,因为这将是由在上述屏幕截图中使用的 XSLT 样式表返回的根元素。

图 16. XML 分析器步骤的文档根窗口
图像显示 XML 分析器步骤的文档根窗口

重要的是要注意,只有返回一个格式良好的 XML 文档的 XSLT 样式表可由程序集使用。


性能调优

通过大型数据集编写 XML 文档

在大多数情况下,XML 文档到关系型数据的解析可通过串流方式完成,而无需太多内存且不管文档有多大。但是在编写 XML 文档时,通常要联接和重构大型数据集,以匹配所需的文档结构。在 DataStage 中通过 XML stage 有多种方式可执行该转换。两种方法在 XML stage 文档中都有描述,如 Examples of Transforming XML data 下的 Example 2 和 Example 3。在 Example 2 中,联接在 DataStage 中完成,它是一个关系型联接,产生一个有重复的平板式列表。 因此在程序集内,重新组合步骤用于消除这些重复并创建所需的嵌套列表结构。在 Example 3 中,联接在程序集内以分层方式完成,且立即创建所需的嵌套列表。

如果数据集很大,建议在 DataStage 而非程序集中执行联接。DataStage 联接可并行执行,且比 Assembly Editor 内的分层联接更有效。此外,如果联接而来的数据被联接键集群化(如果具有相同键值的所有记录彼此相邻),作业可经过进一步优化,以使用较少内存。在这种情况下,在 Assembly Editor 中的重新分组步骤上,您应当检查 Input Records of Regroup are clustered by key – optimize execution。这会增强 XML stage 的性能,允许它以串流方式执行重新分组,而无需存储整个列表。

通过内存中处理增强吞吐量

如果需要编译成单一文档的关系型数据小到可以包含在内存中,您应当增强 XML stage 性能,允许它使用更多内存,并配置联接步骤来执行内存中操作。

  1. 配置 XML Stage 以使用 768M — 在 XML Stage Editor 中,为 Optional Arguments 字段添加 –Xmx768M 值。
图 17. Stage Editor 窗口
图像显示为 Optional Arguments 字段设置的 Stage Editor 窗口 Xmx768M
  1. 配置 H-Join 以使用内存中算法 — 在 H-Join Step 中,定义父列表和子列表后,有一个选项来选择应使用的算法。通过使用 In-memory 选项可增强 XML stage 性能。
图 18. H-Join 步骤中的优化类型
图像显示 H-Join 步骤中的优化类型

并行执行多个文档

在处理多个文档时,DataStage 并行处理和分区有助于增加吞吐量。如果需要解析多个文档,使用程序集的分析器步骤中的 String-SetFile-Set 选项并在 XML stage 之前对 stages 中的文档分区,将会大有裨益。类似地,如果需要创建许多文档,也可以对数据进行分区,如果分区键会分割数据,这样一个分区就包含一个文档所需的所有信息。

注意在两种情况下,程序集不知道分区,或换言之:它不需要为并行执行而有不同的配置。

并行执行一个大文档

XML stage 有一个独特的功能,即支持并行处理大型 XML 文件。当您需要解析超过 1 GB 的 XML 文件时,该功能很有价值;您只有一小部分文件而有许多处理器。如果您有多个文档,且您的目标是在最少的时间内完成所有解析,那么您应当使用上面描述的常规 DataStage 分区,这会让所有处理器忙于处理不同的文档。但是,如果您有一小部分文件,且您的目标是尽可能在最少的时间内完成每个文档,那么您可以启用 Assembly Editor 分析器步骤中的并行解析功能。

该解析方法在 “大规模并行解析” 下的 Information Center 中有描述。该方法对文件的不同部分运行相同的程序集,且结果经收集会被向下发送到下个 stage。


结束语

在本文中,我们解释了 DataStage 程序集概念,详细介绍了一些特性,提供了在很多场景中有所帮助的性能建议。对于许多简单情况,不需要对这些概念的深刻理解。但是,当您在处理复杂架构和大量数据时,建议对本文描述的概念有一个好的理解。


下载

描述名字大小
第 2 部分的 DataStage 作业样例dm-1103datastagesPart2Examples.zip61KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML
ArticleID=682216
ArticleTitle=使用 IBM InfoSphere DataStage 8.5 中的 XML 转换功能,第 2 部分: 了解程序集
publish-date=06232011