我有一个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节点。
任何帮助表示赞赏。
答案 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;