0

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

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

Pentaho 维基 说:

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

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

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

流程如下:

1) 用 StAX 读取

2) 修改后的 Java Script 值

3) 输出到数据库

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

变量编号;

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 组件而出现此问题。

干杯!

4

1 回答 1

2

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

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

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

这是你要找的吗?如果不是,请让我知道我在哪里误解了,也许我可以提供帮助。

于 2012-09-25T17:02:16.167 回答