使用 UDF 在 Pig 中解析 XML 文件

Posted

技术标签:

【中文标题】使用 UDF 在 Pig 中解析 XML 文件【英文标题】:Parse XML file in Pig using UDF 【发布时间】:2016-05-17 15:28:41 【问题描述】:

我想使用 Pig 解析 XML 文件。请在下面找到 XML

<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>
       <amount>25</amount>
       <tax>12</tax>
       <total>37</total>
    </price>
    <publish_date>2000-10-01</publish_date>
    <description>An in-depth look at creating applications with XML</description>
  </book>
</catalog>

我目前正在使用 XMLLoader 加载 XML 文件并使用正则表达式来解析 XML

代码:

REGISTER piggybank.jar

A=LOAD '/users/books.xml' using org.apache.pig.piggybank.storage.XMLLoader
('book') as (x:chararray);

B=FOREACH A GENERATE(REGEX_EXTRACT_ALL(x,'<book.*?id="([^>]*?">.*?<author>([^>]*?)</author>.*?</book>'));

dump B;

我想了解是否有任何其他方法来解析 XML - 可能是使用 UDF。是否有任何 UDF 可用于解析 XML,或者我如何创建 UDF 来服务于我的目的。我使用的是 Pig 0.12 版,而 XPath 在此版本中不起作用。

提前致谢

【问题讨论】:

【参考方案1】:

如果您使用的是正则表达式,即shouldn't,您可能也不太担心速度,所以只需使用惰性 dotall (.*) 量词:

 <book.*?id="(.*?)".*?<author>(.*?)<\/author>.*?<title>(.*?)<\/title>

demo

【讨论】:

以上是关于使用 UDF 在 Pig 中解析 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pig 解析 XML 文件

Pig 版本和 UDF

创建 pig udf 架构时遇到问题

Pig - 解析 XML 文件

Pig UDF 将文件写入 HDFS

PIG UDF 加载 .gz 文件失败