Sql 在配置单元中,是否有一种方法可以解析同一XML系列中同一标记的多次出现?
在我的场景中,每个父族下都会出现一个名称标记。父族重复,每个族中都有多个值标记。我的期望是解析每个[Name,Value]对,并按行显示它们 示例XML和预期输出如下所示:Sql 在配置单元中,是否有一种方法可以解析同一XML系列中同一标记的多次出现?,sql,xml,xpath,hive,hiveql,Sql,Xml,Xpath,Hive,Hiveql,在我的场景中,每个父族下都会出现一个名称标记。父族重复,每个族中都有多个值标记。我的期望是解析每个[Name,Value]对,并按行显示它们 示例XML和预期输出如下所示: <ParentArray> <ParentFieldArray> <Name>ABCD</Name> <Value> <string>111</string>
<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>
此处重复ParentFieldArray族,其中的值标记数量也因族而异
已尝试查询:
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;
我试图用横向视图进行查询。。概念,但它似乎不起作用。基本上,我无法根据每个值的位置映射正确的名称。这会导致交叉连接
SQL中是否有任何其他函数/概念可以如上所示获取输出?获取名称并将其传递给第二个XPATH,以仅筛选包含该名称的ParentFieldArray 演示:
非常感谢你在这里的帮助。。基本上是检索名称标记&将它们分别映射到各自的值标记。干杯通过上述方法,我可以解决存在非空值标记的场景。也有存在空/空值标记的场景。有没有一种方法也可以阅读它们?假设在上面的XML中,如果ParentFieldArray中的Value标记下有一个or事件,是否有一种方法可以将它们作为单独的行读取,其中名称将填充为空白值?@RKR类似这样的内容:“ParentArray/ParentFieldArray/Value/string/[非文本]”,但我不完全理解。最好提出新问题并详细描述预期输出。[nottext]应该有助于发现suchI发布了一个新的问题和细节。请查看以下链接:
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;
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