sql - 在 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 中是否还有其他函数/概念可以获取如上所示的输出?
解决方案
获取 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
推荐阅读
- php - add_meta_box 将自定义查询 post_id 与全局 post_id 混合
- javascript - 为什么我不能输入我的 react-native SearchBar?
- unit-testing - 有没有办法在所有测试都运行后执行拆卸功能?
- css - CSS Grid 自动调整列自动换行
- react-native - React Native - 获取 API 错误:[SyntaxError: JSON Parse error: Unexpected identifier "object"]
- c++ - c++向量没有显示我插入的任何值
- python - Python2 和 Python3 DPKT 似乎返回不同的输出格式
- apache-spark - pyspark - 在 Spark 会话中获得一致的随机值
- python - python列表中的请求问题
- javascript - 为 TSLint (NestJs) 和 ESLint (VueJs) 设置 VS Code linting