在 hive 中数组成多行

问题描述 投票:0回答:1

我有一个配置单元表,其中包含示例行之一:

A、B、[“11”、“12”、“13”]、[“1”、“2”] 第 3 列和第 4 列的数组长度有时相同,有时不同。

输出:

A、B、11、1

A、B、12、2

A、B、13、[空]

我是 Hive 新手,确实需要帮助来解决这个问题。

数组的长度不断变化。它不是静态的。有时它的长度是 3、4 或 5。这就是我被困住的地方。

我在hive中使用了poseexplode函数

arrays hive explode
1个回答
0
投票

这里,我们需要将其分为三个任务:

  1. 删除不相关的字符,例如'['、']'和'"'

  2. 正如你所说,
  3. 使用

    posexplode
    将数组分解为行,重要的是要注意保存数组数字

  4. 连接爆炸结果的结果,同时将任何缺失值保留为空,所以我们需要

    left join

hive sql如下:

WITH data1
AS (
    SELECT 'A' col1
        ,'B' col2
        ,'["11", "12", "13"]' AS array_str1
        ,'["1", "2"]' AS array_str2
    )
    ,table1
AS (
    SELECT col1
        ,col2
        ,pos
        ,element
    FROM data1 LATERAL VIEW posexplode(SPLIT(REPLACE(REPLACE(REPLACE(array_str1, '"', ''), '[', ''), ']', ''), ',')) pos AS pos
        ,element
    )
    ,table2
AS (
    SELECT col1
        ,col2
        ,pos
        ,element
    FROM data1 LATERAL VIEW posexplode(SPLIT(REPLACE(REPLACE(REPLACE(array_str2, '"', ''), '[', ''), ']', ''), ',')) pos AS pos
        ,element
    )
SELECT t1.col1
    ,t1.col2
    ,t1.element
    ,t2.element
FROM table1 t1
LEFT JOIN table2 t2 ON t1.col1 = t2.col1
    AND t1.col2 = t2.col2
    AND t1.pos = t2.pos

输出:

col1    col2    element element
    A   B   11  1
    A   B    12  2
    A   B    13 NULL
© www.soinside.com 2019 - 2024. All rights reserved.