Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Xpath将XML节点提取到配置单元表中_Xml_Hadoop_Xpath_Hive - Fatal编程技术网

使用Xpath将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

我们有一个配置单元表,其中一个字符串列包含XML。为了简化,假设该表为:

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>
但我发现这很难。我对蜂巢还不太熟悉,但我觉得像这样的东西应该很流行

以下问题是相关的:

但是没有答案。这个问题有一个相关的答案:

但我认为在这种情况下不能使用xml SerDe。通过这项研究,我尝试过这样的事情:

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 ---