首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在蜂巢中,如何在XML中存在相同的父标记下爆炸子标记?

在蜂巢中,如何在XML中存在相同的父标记下爆炸子标记?
EN

Stack Overflow用户
提问于 2021-03-11 10:25:46
回答 1查看 93关注 0票数 1

在下面的Hive-query中,我需要映射父标记下的子标记,其值与XML内容的值相同。到目前为止,交叉连接正在发生,因为父标记值"ABCD“在这里重复。

代码语言:javascript
复制
with your_data as (
select  '<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string></string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string/>
            <string>444</string>
            <string>555</string>
        </Value>
    </ParentFieldArray>
</ParentArray>' as xmlinfo
)
select name, case when value='NULL' then '' else value end value
  from (select regexp_replace(xmlinfo,'<string></string>|<string/>','<string>NULL</string>') xmlinfo 
          from your_data d
       ) 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;

查询的预期输出:

代码语言:javascript
复制
Name    Value
ABCD    111
ABCD    
ABCD       
ABCD    444
ABCD    555
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 12:25:46

除了名称之外,您还可以使用position ()代替instead ()来获得位置。然后在第二个XPATH中按位置筛选数组,在本例中可能不需要名称筛选器,在更大的数据集中调试它。我使用了两种方法:名称和索引过滤器,它适用于您的数据示例。XPATH中的位置从1开始,在单元格中的位置从0开始,这就是使用pos+1的原因:

代码语言:javascript
复制
with your_data as (
select  '<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string></string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string/>
            <string>444</string>
            <string>555</string>
        </Value>
    </ParentFieldArray>
</ParentArray>' as xmlinfo
)
select name, pos+1 as pos, case when value='NULL' then '' else value end value
  from (select regexp_replace(xmlinfo,'<string></string>|<string/>','<string>NULL</string>') xmlinfo 
          from your_data d
       ) d
       lateral view outer posexplode(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Name/text()')) pf as  pos, Name
       lateral view outer explode(XPATH(xmlinfo, concat('((ParentArray/ParentFieldArray)[',pf.pos+1, '])[Name="', pf.Name, '"]/Value/string/text()'))) vl as value;

结果:

代码语言:javascript
复制
name    pos value
ABCD    1   111
ABCD    1   
ABCD    2   
ABCD    2   444
ABCD    2   555
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66580649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档