如何在 pig 中读取带有嵌套节点的 XML 文件

Posted

技术标签:

【中文标题】如何在 pig 中读取带有嵌套节点的 XML 文件【英文标题】:How to read an XML files with nested nodes in pig 【发布时间】:2015-08-02 17:36:45 【问题描述】:

我想在 PIG 中读取一个 XML 文件。 XML 文件如下所示:

<pdv id="10000001" latitude="" .... >
[....]
 <prix id="1" maj="2007-01-01 00:00:00" valeur="12"\>
 <prix id="1" maj="2007-01-01 00:00:01" valeur="15"\>
 <prix id="1" maj="2007-01-02 00:00:00" valeur="56"\>
</pdv>

对于每个 pdv(零售店),该文件有多个包含数据价格的节点。我想像这样收集每个零售店的所有价格:

10000001,2007-01-01 00:00:00,12
10000001,2007-01-01 00:00:01,15
10000001,2007-01-02 00:00:00,56

我尝试使用此脚本:

REGISTER piggybank.jar

A =  LOAD 'xmls/stations.xml' using  org.apache.pig.piggybank.storage.XMLLoader('pdv') as (x:chararray);

B = foreach A GENERATE FLATTEN(REGEX_EXTRACT_ALL(x,'<pdv id="[0-9]*" latitude[\\s\\S]*<prix id="1" maj="[^a-z]*" valeur="[0-9]*"/>[\\s\\S]*</pdv>')) AS (id:chararray,prix:float);

dump B;

但我只得到了每个零售店的第一个节点。嵌套节点太多,无法在脚本中枚举它们。我尝试使用 Xpath 或 XMLStreamingLoader,但这些语法似乎不起作用。

【问题讨论】:

我不知道在这种情况下如何开始,但这种问题需要更小的步骤。 【参考方案1】:

您可以尝试使用带有@ 的XPath 来获取里面的所有属性。下面的代码可能会对您有所帮助。

A = LOAD 'xmls/stations.xml' using org.apache.pig.piggybank.storage.XMLLoader('pdv') as (x:chararray);

B = foreach A GENERATE XPath(x,'pdv/prix/@id') AS id, XPath(x,'pdv/prox/@maj') AS maj, XPath(x,'pdv/prox/@valeur') AS valeur;

转储 B;

【讨论】:

以上是关于如何在 pig 中读取带有嵌套节点的 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pig 脚本解析 xml 元素节点?

Pig:使用嵌套对象加载 xml

从访问中导出嵌套的 XML 文件。需要带有节点的XML文件[重复]

在 PIG 中读取带有模式的文件

在 Perl 中读取带有巨大文本节点的 xml 的实用方法

使用 PIG 读取 XML