2016-12-16 52 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']