在 PIG 中使用 xpath 提取 XML 中的属性值
Posted
技术标签:
【中文标题】在 PIG 中使用 xpath 提取 XML 中的属性值【英文标题】:Extract attribute value in XML using xpath in PIG 【发布时间】:2016-05-24 07:13:41 【问题描述】:我有以下输入 XML
<Type>
<Source>
<TimeStamp>2016-02-19T12:27:06.387Z</TimeStamp>
<IPAddress IPVersion="IPv4">x.xx.xxx.xxx</IPAddress>
<Port>64435</Port>
<DNS_Name>x.xx.xxx.xxx.range9-27.abc.com</DNS_Name>
</Source>
</Type>
我正在尝试使用以下代码从上述标签中检索所有值。
REGISTER piggybank-0.15.0.jar
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
A = LOAD 'test.xml' using org.apache.pig.piggybank.storage.XMLLoader('Type') as (x:chararray);
B = FOREACH A GENERATE
XPath(x, 'Source/TimeStamp')
,XPath(x, 'Source/IPAddress')
,XPath(x, 'Source/IPAddress/@IPVersion')
,XPath(x, 'Source/Port')
,XPath(x, 'Source/DNS_Name');
当我转储 B 时,我得到以下输出,其中缺少 IPVersion 的值。
(2016-02-19T12:27:06.387Z,x.xx.xxx.xxx,,64435,x.xx.xxx.xxx.range9-27.abc.com)
谁能帮我解决这个问题?
【问题讨论】:
我认为通过 XPathAll 你可以实现这一点。请看我的回答 如果没问题...你能不能也标记“被所有者接受” 【参考方案1】:piggybank 的 XPath 类中有 2 个错误:
ignoreNamespace 逻辑中断了对 XML 属性的搜索 https://issues.apache.org/jira/browse/PIG-4751
ignoreNamepace参数默认为true,不能被覆盖 https://issues.apache.org/jira/browse/PIG-4752
使用XPathAll
here查看解决方法
【讨论】:
感谢您的回答。你能说出 XpathALL 的类名吗?因为我在定义 XpathALL 时遇到错误。 pig.apache.org/docs/r0.15.0/api/org/apache/pig/piggybank/… piggybank-0.12.0.jar有这个类,你需要检查你的jar版本有没有这个类 它对我不起作用。它抛出以下错误 2016-05-26 06:56:19,884 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve org.apache.pig.piggybank.evaluation.xml.XPathALL使用导入:[, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] 您是否注册了包含 XpathAll 类的 piggybank jar 版本?以上是关于在 PIG 中使用 xpath 提取 XML 中的属性值的主要内容,如果未能解决你的问题,请参考以下文章