【问题标题】:Get the names of XML nodes using XPATH on Hive在 Hive 上使用 XPATH 获取 XML 节点的名称
【发布时间】:2016-11-09 14:59:50
【问题描述】:

我有一个xml文档如下:

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

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

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

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

【问题讨论】:

    标签: xml hadoop xpath hive


    【解决方案1】:

    一般来说,您只能使用xpath 来获取文本或元素属性——而不是节点的名称。

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

    或者,你可以使用这个技巧:

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

    说明:它将 nodename 属性添加到任何 xml 元素。 (&lt;to&gt; -&gt; &lt;to nodename='to'&gt;) 它也可以将它添加到一些文本中,但是由于您只提取了nodename 属性 - 这应该没关系。

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

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

    【讨论】:

    • 谢谢 Alex,对自定义 UDF 有什么建议吗?
    • @DonGorgon 您可以使用original hive xpath UDF 并将第83 行从getNodeValue() 更改为getNodeName()。也许添加一些测试以确保节点是一个元素
    • 感谢您的建议。那肯定行得通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多