使用 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 实现 SCD Type 2 (Pentaho Data Integration 5.2)
pentaho dpi-5.3(kettle)中的mongodb源代码在哪里?