2015-09-25 95 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) –

相關問題