使用 PIG 读取 XML

Posted

技术标签:

【中文标题】使用 PIG 读取 XML【英文标题】:Reading XML using PIG 【发布时间】:2015-05-05 11:57:55 【问题描述】:

我正在尝试使用 PIG 从 xml 文件中读取数据,但输出不完整。

输入文件-

<document>   
<url>htp://www.abc.com/</url>
<category>Sports</category>
<usercount>120</usercount>
<reviews>    
<review>good site</review>
<review>This is Avg site</review>
<review>Bad site</review>
</reviews>
</document>

我使用的代码是:

register 'Desktop/piggybank-0.11.0.jar';
A = load 'input3' using org.apache.pig.piggybank.storage.XMLLoader('document') as (data:chararray);


 B = foreach A GENERATE FLATTEN(REGEX_EXTRACT_ALL(data,'(?s)<document>.*?<url>([^>]*?)</url>.*?<category>([^>]*?)</category>.*?<usercount>([^>]*?)</usercount>.*?<reviews>.*?<review>\\s*([^>]*?)\\s*</review>.*?</reviews>.*?</document>')) as (url:chararray,catergory:chararray,usercount:int,review:chararray);

我得到的输出是:

(htp://www.abc.com/,Sports,120,good site)

这是不完整的输出。有人可以帮我解决我的遗漏吗?

【问题讨论】:

根据正则表达式,输出是正确的。您需要在正则表达式中添加reviews 以获取所有review。无论如何,正则表达式不是 xml 解析的首选 (***.com/questions/701166/…)。我建议你使用 UDF。 我也尝试过使用评论。但输出仍然不完整 你应该单独添加所有review标签。 是的。但是如果我有很多呢。说 1000 条评论。可以添加 1000 条评论标签.. 不确定,关于那个哥们。让我试一试,然后回来。我仍然建议您将 UDF 用于 xml :) 【参考方案1】:

啊!!终于使用cross 让它工作了。我正在使用XPath,如果需要,您可以使用正则表达式。我发现,XPath 方式比正则表达式更简单、更简洁。我想,你也可以看到它。不要忘记用您的 XML 替换 testXML.xml

XPath 方式:

DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
A = LOAD 'testXML.xml' using org.apache.pig.piggybank.storage.XMLLoader('document') as (x:chararray);
B = FOREACH A GENERATE XPath(x, 'document/url'), XPath(x, 'document/category'), XPath(x, 'document/usercount');
C = LOAD 'testXML.xml' using org.apache.pig.piggybank.storage.XMLLoader('review') as (review:chararray);
D = FOREACH C GENERATE XPath(review,'review');
E = cross B,D;
dump E;

正则表达式方式:

A = LOAD 'testXML.xml' using org.apache.pig.piggybank.storage.XMLLoader('document') as (x:chararray);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(x,'(?s)<document>.*?<url>([^>]*?)</url>.*?<category>([^>]*?)</category>.*?<usercount>([^>]*?)</usercount>.*?</document>')) as (url:chararray,catergory:chararray,usercount:int);
C = LOAD 'testXML.xml' using org.apache.pig.piggybank.storage.XMLLoader('review') as (review:chararray);
D = FOREACH C GENERATE FLATTEN(REGEX_EXTRACT_ALL(review,'<review>([^>]*?)</review>'));
E = cross B,D;
dump E;

输出:

(htp://www.abc.com/,Sports,120,Bad site)
(htp://www.abc.com/,Sports,120,This is Avg site)
(htp://www.abc.com/,Sports,120,good site)

这不是你所期待的吗? ;)

【讨论】:

太棒了阿布舍克!抱歉,Xpath 不适用于 Pig 版本 0.8.0 :( 错误 1070:无法使用导入解析 org.apache.pig.piggybank.evaluation.xml.XPath @Sachin ok.. 也添加了正则表达式方法。我希望现在您的问题将得到解决。 ;) 我能问你一些与此相关的事情吗?扩展种..如果你不介意 如果我在输入中有多个文档而不是一个怎么办? 有两种方式。 1.您可以单独加载每个文档。 2.您可以使用一些xml serde在hive表中加载数据并使用hive表;)

以上是关于使用 PIG 读取 XML的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Piggybank 使用 Pig 进行 XML 解析

可以使用 PIG 读取的文件格式

Pig:使用嵌套对象加载 xml

解析 PIG-XML 时出错

使用 UDF 在 Pig 中解析 XML 文件