使用Xpath将XML节点提取到配置单元表中
我们有一个配置单元表,其中一个字符串列包含XML。为了简化,假设该表为:使用Xpath将XML节点提取到配置单元表中,xml,hadoop,xpath,hive,Xml,Hadoop,Xpath,Hive,我们有一个配置单元表,其中一个字符串列包含XML。为了简化,假设该表为: DataTable key: string xml: string xml的格式如下: <xml> <entity> <property type="alpha">123</property> <property type="beta">abc</property> <property t
DataTable
key: string
xml: string
xml的格式如下:
<xml>
<entity>
<property type="alpha">123</property>
<property type="beta">abc</property>
<property type="delta">...</property>
</entity>
<entity>
<property type="alpha">321</property>
<property type="beta">cba</property>
<property type="delta">---</property>
</entity>
</xml>
但我发现这很难。我对蜂巢还不太熟悉,但我觉得像这样的东西应该很流行
以下问题是相关的:
select key,
xpath(xml, 'xml/entity/property[@type="alpha"]/text()')) as alpha,
xpath(xml, 'xml/entity/property[@type="beta"]/text()')) as beta,
xpath(xml, 'xml/entity/property[@type="delta"]/text()')) as delta
from DataTable
但结果是:
key1 ["123", "321"] ["abc", "cba"] ["...", "---"]
key2 ["123", "321"] ["abc", "cba"] ["...", "---"]
而不是我真正想要的:
key1 123 abc ...
key1 321 cba ---
key2 123 abc ...
key2 321 cba ---
感谢您花时间阅读本文,如果您能给我提供任何想法,我将不胜感激 基于数组的数据可以与表生成函数(如)结合使用“连接”到关系中。这种情况下的另一个复杂情况是,我们需要3次单独出现的侧视图
,对应于α
β
和δ
数组,这会在结果集中产生完全笛卡尔积的风险;每个alpha/beta/delta排列将生成一个单独的行
为了避免笛卡尔积,我们可以使用一个名为的函数变体,它从原始数组生成数字索引和数据值。然后,我们可以使用过滤条件来确保我们只查看原始数组中按位置匹配的行
查询
WITH DataTable AS (
SELECT 'key1' AS key, '<xml><entity><property type="alpha">123</property><property type="beta">abc</property><property type="delta">...</property></entity><entity><property type="alpha">321</property><property type="beta">cba</property><property type="delta">---</property></entity></xml>' AS xml UNION ALL
SELECT 'key2' AS key, '<xml><entity><property type="alpha">123</property><property type="beta">abc</property><property type="delta">...</property></entity><entity><property type="alpha">321</property><property type="beta">cba</property><property type="delta">---</property></entity></xml>' AS xml
)
SELECT
key,
alpha,
beta,
delta
FROM DataTable
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="alpha"]/text()')) xml_alpha AS pos_alpha, alpha
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="beta"]/text()')) xml_beta AS pos_beta, beta
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="delta"]/text()')) xml_delta AS pos_delta, delta
WHERE pos_alpha = pos_beta
AND pos_beta = pos_delta
;
如果需要进行进一步的定制,那么您可以考虑编写自己的定制,按照需要生成行。
基于数组的数据可以“结合”成一个关系,并结合表生成函数,例如。这种情况下的另一个复杂情况是,我们需要3次单独出现的
侧视图
,对应于α
β
和δ
数组,这会在结果集中产生完全笛卡尔积的风险;每个alpha/beta/delta排列将生成一个单独的行
为了避免笛卡尔积,我们可以使用一个名为的函数变体,它从原始数组生成数字索引和数据值。然后,我们可以使用过滤条件来确保我们只查看原始数组中按位置匹配的行
查询
WITH DataTable AS (
SELECT 'key1' AS key, '<xml><entity><property type="alpha">123</property><property type="beta">abc</property><property type="delta">...</property></entity><entity><property type="alpha">321</property><property type="beta">cba</property><property type="delta">---</property></entity></xml>' AS xml UNION ALL
SELECT 'key2' AS key, '<xml><entity><property type="alpha">123</property><property type="beta">abc</property><property type="delta">...</property></entity><entity><property type="alpha">321</property><property type="beta">cba</property><property type="delta">---</property></entity></xml>' AS xml
)
SELECT
key,
alpha,
beta,
delta
FROM DataTable
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="alpha"]/text()')) xml_alpha AS pos_alpha, alpha
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="beta"]/text()')) xml_beta AS pos_beta, beta
LATERAL VIEW posexplode(xpath(xml, 'xml/entity/property[@type="delta"]/text()')) xml_delta AS pos_delta, delta
WHERE pos_alpha = pos_beta
AND pos_beta = pos_delta
;
如果需要进一步的定制,那么您可以考虑编写自己的自定义行,这些行正好按照您需要的方式生成行。
谢谢克里斯。你的回答既正确又有教育意义。非常有帮助!现在,我正努力尝试以某种方式整合这个外部视图,因为不是每个实体都有,例如,“beta”属性,在这种情况下,我希望beta列中有一个NULL。我会继续玩下去,如果我弄不懂的话,我会发布一个不同的问题。再次感谢。@Ckratide,很高兴听到这有帮助!听起来您可能正处在一条需要更多自定义逻辑的道路上。我编辑了答案,说您可能想考虑编写自己的自定义UDTF。谢谢你,克里斯。你的回答既正确又有教育意义。非常有帮助!现在,我正努力尝试以某种方式整合这个外部视图,因为不是每个实体都有,例如,“beta”属性,在这种情况下,我希望beta列中有一个NULL。我会继续玩下去,如果我弄不懂的话,我会发布一个不同的问题。再次感谢。@Ckratide,很高兴听到这有帮助!听起来您可能正处在一条需要更多自定义逻辑的道路上。我编辑了答案,说您可能想考虑编写自己的自定义UDTF。 key alpha beta delta
0 key1 123 abc ...
1 key1 321 cba ---
2 key2 123 abc ...
3 key2 321 cba ---