我正在使用hadoop配置单元并尝试处理xml文件。文件如下所示:
<asds4_0:SASDS>
<stl15:GetRS>
<stl15:RS>
<stl15:ORES>
<stl15:ORE>
<stl15:AccF>
<stl15:Transaction>
<stl15:Status>Hold</stl15:Status>
</stl15:Transaction>
</stl15:AccF>
</stl15:ORE>
<stl15:ORE>
<stl15:AccF>
<stl15:Transaction>
<stl15:Status>Active</stl15:Status>
</stl15:Transaction>
</stl15:AccF>
</stl15:ORE>
</stl15:ORES>
</stl15:RS>
</stl15:GetRS>
</asds4_0:SASDS>
我用来检索状态的xpath是:
SELECT
Status
FROM scenario1
LATERAL VIEW explode(xpath(cast(body as string),"//*[local-name()='SASDS']//*[local-name()='GetRS']//*[local-name()='RS']//*[local-name()='ORES']//*[local-name()='ORE']//*[local-name()='AccF']//*[local-name()='Transaction']//*[local-name()='Status']/text()")) adTable as Status
这个xpath返回active和hold两种状态。问题是我只想检索活动状态。我尝试使用这样的[[local-name()='status']='active'](就像这里显示的那样https://www.w3schools.com/xml/xpath_syntax.asp)我仍然保持着这两项记录。
我不想在sql中使用where status='active',因为当我将此字段与其他字段组合时,它不会返回所需的行。
2条答案
按热度按时间vzgqcmou1#
首先,有没有什么具体的原因让你使用像
到处都是?它与
此外,您使用
//*
无处不在,它返回并搜索所有后代元素。但是考虑到您的xml结构,您通常只想访问直接的子对象,因此使用/
.所以,最好是:
cigdeys32#
我喜欢德克的解决方案,但是,正如你可能已经发现的,它对你不起作用。hive中内置xml支持的许多限制之一是它基于XPath1.0。
但是,您可以将他的解决方案与oracle xml extensions for hive结合使用:http://docs.oracle.com/bigdata/bda49/bdcug/oxh_hive.htm#bdcug691
它是oracle xquery for hadoop的一部分,可在以下位置下载:http://www.oracle.com/technetwork/database/database-technologies/bdc/big-data-connectors/downloads/index.html
示例:
将返回:“活动”
还有一个表函数:
如果您想放弃通配符,还需要良好的命名空间支持: