在 Hive 中,如何从 XML 中的标记定义中获取值?

In Hive, how to get the values from within tag definitions in an XML?

在 Hive 查询中解析 XML 时如何考虑标记定义?下面是我要解析的XML:

<Parents>
    <Parent>
      <emp id="A12345">
        <acc name="perm_ID">44444</acc>
        <acc name="temp_ID">55555</acc>
      </emp>
    </Parent>
</Parents>

有3个字段EmpID、PermID和TempID。预期输出为:

EmpID   PermID  TempID
A12345  44444   55555

XPATH() returns 节点列表,XPATH_STRING() returns 标量字符串。如果 XML 数组中有很多 emp,请使用 XPATH() 获取 Id 属性列表 + lateral view explode 分解行,然后使用 Id 参数化 XPATH_STRING从相应的 emp.

获取元素

查看此演示 (Hive):

with mytable as (
select '<Parents>
    <Parent>
      <emp id="A12345">
        <acc name="perm_ID">44444</acc>
        <acc name="temp_ID">55555</acc>
      </emp>
    </Parent>
</Parents>' as xml
)

select e.Id as EmpId, 
      XPATH_STRING(t.xml,concat('/Parents/Parent/emp[@id="',e.Id,'"]/acc[@name="perm_ID"]/text()')) permID,
      XPATH_STRING(t.xml,concat('/Parents/Parent/emp[@id="',e.Id,'"]/acc[@name="temp_ID"]/text()')) tempID
  from mytable t
       lateral view outer explode(XPATH(t.xml, '/Parents/Parent/emp/@id')) e as  Id

结果:

empid   permid    tempid    
A12345  44444     55555

在此演示中,您可以了解如何处理数组和标量元素和属性,以及如何使用其他 xpath 提取的值来参数化您的 xpath。

另请参阅其他 Hive XPATH 函数:XPathUDF