2015-09-25 74 views
1

我想用Pig Latin从xml中提取属性。如何在Pig中使用Xpath提取xml属性?

这是xml文件

<CATALOG> 
<BOOK> 
<TITLE test="test1">Hadoop Defnitive Guide</TITLE> 
<AUTHOR>Tom White</AUTHOR> 
<COUNTRY>US</COUNTRY> 
<COMPANY>CLOUDERA</COMPANY> 
<PRICE>24.90</PRICE> 
<YEAR>2012</YEAR> 
</BOOK> 
</CATALOG> 

我用这个脚本,但它没有工作的一个样本:

REGISTER ./piggybank.jar 
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath(); 

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

B = FOREACH A GENERATE XPath(x, 'BOOK/TITLE/@test'), XPath(x, 'BOOK/PRICE'); 
dump B; 

产量为:

(,24.90) 

希望有人可以帮助我。 谢谢。

+0

也许你的意思' 'BOOK/TITLE/@ test'',而不是'' 书籍/作者/ @测试” '? 'AUTHOR'元素没有'test'属性。 – LarsH

+0

哦,是的,在我使用Title的实际代码中。对于那个很抱歉。 – AL7

+0

如果'BOOK/PRICE'与给定焦点一起工作,那么'BOOK/TITLE/@ test'也应该起作用,除非piggybank不支持属性。我假设'BOOK/TITLE'也适用?你可以试试'BOOK // @ *',它应该为你提供BOOK下的所有属性。 – Abel

回答

1

有2条虫子在扑满的XPath类:

  1. 的ignoreNamespace逻辑断裂搜索XML属性 https://issues.apache.org/jira/browse/PIG-4751

  2. 的ignoreNamepace参数默认为真,并不能覆盖 https://issues.apache.org/jira/browse/PIG-4752

这是我的工作次使用XPathAll:

XPathAll(x, 'BOOK/TITLE/@test', true, false).$0 as (test:chararray) 

此外,如果你还需要忽略的命名空间:

XPathAll(x, '//*[local-name()=\'BOOK\']//*[local-name()=\'TITLE\']/@test', true, false).$0 as (test:chararray) 
+0

我也面临同样的问题,并尝试相同的方式,你建议,但它不适合我。 '返回错误。 productsOneByOne = FOREACH allProducts GENERATE XPathAll(x,'product/@ productID',true,false)。$ 0 as(productid:chararray); ERROR org.apache.pig.tools.grunt.Grunt - 错误1025:<第4行,第57列>无效的字段投影。投影字段[x]在模式中不存在:data:chararray' 我的帖子:[http:// stackoverflow。COM /问题/ 35887260/Hadoop的猪XPath的返回空属性值](http://stackoverflow.com/questions/35887260/hadoop-pig-xpath-returning-empty-attribute-value) –