使用 StAX / Kettle (Pentaho) 读取 XML 文件

Posted

技术标签:

【中文标题】使用 StAX / Kettle (Pentaho) 读取 XML 文件【英文标题】:Reading XML-files with StAX / Kettle (Pentaho) 【发布时间】:2012-08-31 19:29:02 【问题描述】:

我正在使用 Pentaho (Spoon / Kettle) 进行 ETL 过程,我想在其中读取 XML 文件并将元素值存储到 db。

这适用于“从 XML 获取数据”-组件...但是 XML 文件很大,有几个千兆字节,因此读取文件需要很长时间。

Pentaho 维基说:

现有的从 XML 获取数据步骤更易于使用,但使用 DOM 需要内存处理甚至部分清除的解析器 当这些部分非常大时,文件的大小是不够的。

XML 输入流 (StAX) 步骤使用完全不同的方法 解决具有非常大和复杂的数据结构的用例和 需要非常快速的数据加载...

因此,我现在正在尝试对 StAX 做同样的事情,但它似乎并没有按计划进行。我正在使用只有一个元素组的 XML 文件对此进行测试。读取该文件,然后将其映射/插入到表中......但现在我得到多行到表中,其中所有值都是“未定义”的,有些行我有正确的值。表格中总共有 92 行,即使它应该只有一行。

流程如下:

1) 使用 StAX 读取

2) 修改后的 Java 脚本值

3) 输出到数据库

在第 2 步)我正在执行以下操作:

变量 id;

if ( xml_data_type_description.equals("CHARACTERS") && xml_path.equals("/labels/label/id") ) id = xml_data_value; ...

我以 http://forums.pentaho.com/showthread.php?83480-XPath-in-Get-data-from-XML-tool&p=261230#post261230 的 positional-staz.zip 为例。

如何使用 StAX 读取 XML 文件并将元素值存储到 DB?

我一直在尝试寻找示例,但没有找到太多。上面的示例在插入行之前使用了“Filter Rows”组件。我不太明白为什么要使用它,我不能只映射我需要的值吗?可能是因为我不使用或不知道如何使用 Filter Rows 组件而出现此问题。

干杯!

【问题讨论】:

【参考方案1】:

我在上面列出的论坛上发布了一个可能的基于 StAX 的解决方案,但我将在此处发布它的要点,因为它正在等待版主批准。

使用 StAX 解析器,您可以只选择那些您关心的元素,即数据类型为 CHARACTERS 的元素。对于论坛示例,您基本上需要对 4 组(EXPR、EXCH、DATE、ASK)中的行进行非规范化。为此,您将行号添加到流中(使用添加序列步骤),然后使用计算器确定“桶号”= INT((rownum-1)/4)。这将为您提供 Row Denormaliser 步骤的分组字段。

帖子获得批准后,您会看到一个使用 StAX 和我在上面描述的方法的转换的链接。

这就是你要找的吗?如果不是,请告诉我我误解的地方,也许我可以提供帮助。

【讨论】:

以上是关于使用 StAX / Kettle (Pentaho) 读取 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pentaho Kettle/PDI 将行列转换为行

使用 Pentaho Kettle 实现 SCD Type 2 (Pentaho Data Integration 5.2)

pentaho dpi-5.3(kettle)中的mongodb源代码在哪里?

Pentaho Kettle 连接到 Hadoop 集群

Pentaho Data Integration (Kettle) 简介

在 Pentaho Kettle 中应用 Pivot