2016-12-16 51 views
0

我想通過Azure上的Pig腳本運行XML文件。我一直在遇到問題,我認爲可能是由於我的父節點有一個名稱空間。在父節點有命名空間時在Pig中使用XPathAll

REGISTER 'piggybank-0.15.0.jar'; 
DEFINE XPathAll org.apache.pig.piggybank.evaluation.xml.XPathAll(); 
A = LOAD 'file.xml' using org.apache.pig.piggybank.storage.XMLLoader('Parent') as (x:chararray); 
B = FOREACH A GENERATE XPathAll(x, 'Parent/Child', true, true); 
DUMP B; 

運行該腳本沒有錯誤,而是返回一個空的結果:()。由於命名空間的原因,我是否必須以不同的方式調用XMLLoader?

回答

0

通常情況下,你需要聲明一個前綴,說ns,引用默認命名空間URI,然後使用該前綴在默認命名空間中的元件:

ns:Parent/ns:Child 

我不使用豬所以不要不知道它是否支持前綴聲明。純XPath的方法是通過當地名命名空間URI組合適配體(爲了便於閱讀):

*[local-name()='Parent' and namespace-uri()='default ns URI here'] 
/*[local-name()='Child' and namespace-uri()='default ns URI here'] 

如果與其他命名空間中沒有同名的其他元素,那麼你可以通過剝離namespace-uri標準來簡化XPath:

*[local-name()='Parent']/*[local-name()='Child']