gpt4 book ai didi

xml - HiveQL-提取同级节点的值

转载 作者:行者123 更新时间:2023-12-02 20:07:51 27 4
gpt4 key购买 nike

我在 hive 日志表中存储了一个XML Blob(如下所示)。

<user>
<uid>1424324325</uid>
<attribs>
<field>
...
</field>
<field>
<name>first</name>
<value>John</value>
</field>
<field>
...
</field>
<field>
<name>last</name>
<value>Doe</value>
</field>
<field>
...
</field>
</attribs>
</user>

hive 表中的每一行都将包含有关不同用户的信息,我想提取uid,名字和姓氏的值。
1424324325  John    Doe
1424435463 Jane Smith

提取uid值非常简单。但是,我在尝试提取名字和姓氏时陷入困境。问题是关于识别名字和姓氏对并提取值。

我试图提取名字和姓氏,如下所示,但是我收到一个错误消息,说这是一个无效的表达式。
SELECT uid, fn, ln
FROM log_table
LATERAL VIEW explode(xpath(logs['users_updates'], '/user/uid/text()')) uids as uid
LATERAL VIEW explode(xpath(logs['users_updates'], '/user/attribs/field/name/text()="first"/../value/text()')) fns as fn
LATERAL VIEW explode(xpath(logs['users_updates'], '/user/attribs/field/name/text()="last"/../value/text()')) lns as ln;

我想到了如下所示对字段节点使用硬编码的表达式,但问题是不同的记录将在不同的位置具有名字和姓氏值。
LATERAL VIEW explode(xpath(logs['users_updates'], '/user/attribs/field[5]/value/text()')) fns as fn

当我尝试如下所示提取名字时,结果为空。
LATERAL VIEW explode(xpath(logs['users_updates'], '/users/attribs/field/name/[text()="last"]/following-sibling::value[1]/text()')) fns as fn

我怎样才能像下面这样提取我想要的信息?
1424324325  John    Doe
1424435463 Jane Smith

提前致谢。

最佳答案

以下XPath应该会给您正确的结果。您的语法不正确(谓词(即方括号中的所有内容)都必须与一个元素一起使用,但是您只是使用/进行了子步骤)。

/users/attribs/field[name = "first"]/value/string()

此外,一些要点可以改善您的查询:
  • 比较节点值时不必使用text(),它会自动完成,很可能是
  • 更快
  • 您几乎总是想在string()上使用text()
  • 我重写了查询,我认为它更简单,更简洁,因为它基本上说“给我值节点,它的名字节点先值”。您使用后继 sibling 或 parent 的尝试也是有效的,我只是认为这更容易阅读。
  • 关于xml - HiveQL-提取同级节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20696357/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com