在Hive上使用XPATH获取XML节点的名称

时间:2016-11-09 14:59:50

标签: xml hadoop xpath hive

我有一个xml文档如下:

<note>
   <to>Tove</to>
   <from>Jani</from>
   <heading>Reminder</heading>
   <body>Don't forget me this weekend!</body>
</note>

在配置单元中,我可以使用xpath使用以下命令检索XML文档中每个节点的文本:

select xpath(xml_text,'//*[name()='note']//text()') from table_test;

但是,我无法弄清楚在Hive上使用哪个XPATH命令来检索文本的XML节点名称 对于上面的例子,我希望能够返回 ["to","from","heading","body"],表示XML文件中令牌的XML节点。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

通常,您只能使用xpath来获取文本或元素属性 - 而不是节点名称。

因此,有两个选项:您可以编写(或在线查找)自定义UDF,它返回给定xpath的节点名称。

或者,你可以使用这个黑客:

select xpath(regexp_replace(xml_text,'<([\\w]+),'<$1 nodename=\'$1\' '),note/*/@nodename)

说明:它将nodename属性添加到任何xml元素。 (<to> -> <to nodename='to'>)它也可能会在某些文字中添加它,但由于您只提取nodename属性 - 它不应该重要。

顺便说一下,您可以将文本查询重写为:

select xpath(xml_text,'note/*/text()') from table_test;