POSEXPLODE_OUTER 函数

功能描述

POSEXPLODE_OUTER 函数用于将数组或映射类型的表达式展开成多行,并为每行添加位置列。与 POSEXPLODE 不同的是,当输入为 NULL 或空数组/空映射时,POSEXPLODE_OUTER 会保留原始行并输出 NULL 值,而 POSEXPLODE 则会直接丢弃该行。

该函数可以直接使用,也可以与 LATERAL VIEW 搭配使用。

语法

POSEXPLODE_OUTER(expr)

参数说明

  • expr:输入的数组(ARRAY<T>)或映射(MAP<K, V>)表达式。

返回结果

  • 对于数组类型的输入,返回 pos(INT)和 col(T)两列。
  • 对于映射类型的输入,返回 pos(INT)、key(K)和 value(V)三列。
  • 当输入为 NULL 或空数组/空映射时,输出一行,所有列均为 NULL。

使用示例

  1. 展开数组,包含 NULL 输入的情况:

    SELECT id, pos, col
    FROM VALUES (1, array(10, 20)), (2, NULL), (3, array()) AS t(id, arr)
    LATERAL VIEW POSEXPLODE_OUTER(arr) lv AS pos, col;
    +----+------+------+
    | id | pos  | col  |
    +----+------+------+
    | 1  | 0    | 10   |
    | 1  | 1    | 20   |
    | 2  | NULL | NULL |
    | 3  | NULL | NULL |
    +----+------+------+
  2. 对比 POSEXPLODE(会丢弃 NULL 和空数组的行):

    -- 使用 POSEXPLODE:NULL 和空数组的行被丢弃
    SELECT id, pos, col
    FROM VALUES (1, array(10, 20)), (2, NULL), (3, array()) AS t(id, arr)
    LATERAL VIEW POSEXPLODE(arr) lv AS pos, col;
    +----+-----+-----+
    | id | pos | col |
    +----+-----+-----+
    | 1  | 0   | 10  |
    | 1  | 1   | 20  |
    +----+-----+-----+
  3. 展开映射类型,包含 NULL 输入:

    SELECT id, pos, key, value
    FROM VALUES (1, map('a', 1, 'b', 2)), (2, NULL) AS t(id, m)
    LATERAL VIEW POSEXPLODE_OUTER(m) lv AS pos, key, value;
    +----+------+------+-------+
    | id | pos  | key  | value |
    +----+------+------+-------+
    | 1  | 0    | a    | 1     |
    | 1  | 1    | b    | 2     |
    | 2  | NULL | NULL | NULL  |
    +----+------+------+-------+

注意事项

  • 当输入为 NULL 时,POSEXPLODE_OUTER 保留原始行并输出 NULL(包括 pos 列),而 POSEXPLODE 会丢弃该行。
  • 当输入为空数组 array() 或空映射 map() 时,行为与 NULL 相同:保留原始行并输出 NULL。
  • POSEXPLODE_OUTER 常用于 LEFT JOIN 语义的场景,确保即使数组/映射为空或 NULL,主表的行也不会丢失。
  • 该函数可以直接在 SELECT 中使用,也可以与 LATERAL VIEW 搭配使用。

联系我们
预约咨询
微信咨询
电话咨询