sql - 在 Hive 中,有没有办法解析同一 XML 系列中多次出现的同一标签?

标签 sql xml xpath hive hiveql

在我的场景中,每个父家庭下都会出现一次“名称”标签。父族重复,并且每个族内都有多个“值”标签。我的期望是解析每个 [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 POSTEXPLODE(XPATH(..)) 概念进行查询,但它似乎不起作用。基本上我无法根据每个值的位置映射正确的名称。这会导致交叉连接。

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

最佳答案

获取名称并将其传递到第二个 XPATH 以仅过滤包含该名称的 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

关于sql - 在 Hive 中,有没有办法解析同一 XML 系列中多次出现的同一标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65574753/

相关文章:

sql - 使用 SQL 从文本中删除 HTML 标签

mySql 查询错误

sql - 如何优化 MySQL 中的查询?

mysql - 如何选择比一周新的行?

c# - 为什么我的 Xamarin.Forms 应用程序在从 Web API 将数据插入 SQLite 数据库后崩溃?

android - 如何从android中的listview中删除一个项目

java - orm.xml中的Hibernate二级缓存?

java - TagSoup 和 XPath

php - Xpath选择多个标签

python - 如何在 python 中使用 scrapy 获取直接父节点?