在 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

使用XPathAllhere查看解决方法

【讨论】:

感谢您的回答。你能说出 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 中的属性值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pig 在 XPath 中进行嵌套解析

Hadoop - 使用 XPath 在 XML 节点上的 PIG 循环

在 Hadoop 中处理复杂的 XML 以提取数据

XPath - 标量在输出中有不止一行

使用 xPath 解析 xml 并提取属性值

使用 XPath 和正则表达式提取 HTML 注释中的文本