首页 > 解决方案 > 在 Hive 中,有没有办法在同一个 XML 系列中解析多次出现的同一个标签?

问题描述

在我的场景中,每个父家庭下都会出现一次“名称”标签。父族重复,每个族内有多个“值”标签。我的期望是解析每个 [Name, Value] 对并让它们按行显示。

示例 XML 和预期输出如下所示:

<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string>222</string>
            <string>333</string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>EFGH</Name>
        <Value>
            <string>444</string>
            <string>555</string>
        </Value>
    </ParentFieldArray>
</ParentArray>

SQL 查询的输出应该是:

Name         Value
ABCD         111
ABCD         222
ABCD         333
EFGH         444
EFGH         555

这里“ParentFieldArray”系列重复,并且它们中的“Value”标签的数量也因家庭而异。

查询尝试:

select Name, Value from <table_name> -- "xmlinfo" field in this table includes the above XML content
LATERAL VIEW POSEXPLODE(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Name/text()')) NM as Name_pos, Name
LATERAL VIEW POSEXPLODE(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Value/string/text()')) VL as Value_pos, Value;

我试图用LATERAL VIEW POSEXPLODE(XPATH(..))概念查询,但它似乎不起作用。基本上我无法根据它们的位置将正确的名称映射到每个值。这导致交叉连接。

SQL 中是否还有其他函数/概念可以获取如上所示的输出?

标签: sqlxmlxpathhivehiveql

解决方案


获取 Name 并将其传递给第二个 XPATH 以仅过滤包含该 Name 的 ParentFieldArray。

演示:

with your_data as (
select  '<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string>222</string>
            <string>333</string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>EFGH</Name>
        <Value>
            <string>444</string>
            <string>555</string>
        </Value>
    </ParentFieldArray>
</ParentArray>' as xmlinfo
)

select name, value 
  from your_data d
       lateral view outer explode(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Name/text()')) pf as  Name
       lateral view outer explode(XPATH(xmlinfo, concat('ParentArray/ParentFieldArray[Name="', pf.Name, '"]/Value/string/text()'))) vl as value

结果:

name    value
ABCD    111
ABCD    222
ABCD    333
EFGH    444
EFGH    555

推荐阅读