POSEXPLODE_OUTER

功能描述

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

该函数可以直接使用,也可以与

LATERAL VIEW
LATERAL VIEW
搭配使用。

语法

POSEXPLODE_OUTER(expr)

参数说明

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

返回结果

  • 对于数组类型的输入,返回
    pos
    pos
    (INT)和
    col
    col
    (T)两列。
  • 对于映射类型的输入,返回
    pos
    pos
    (INT)、
    key
    key
    (K)和
    value
    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
    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
    POSEXPLODE_OUTER
    保留原始行并输出 NULL(包括 pos 列),而
    POSEXPLODE
    POSEXPLODE
    会丢弃该行。
  • 当输入为空数组
    array()
    array()
    或空映射
    map()
    map()
    时,行为与 NULL 相同:保留原始行并输出 NULL。
  • POSEXPLODE_OUTER
    POSEXPLODE_OUTER
    常用于 LEFT JOIN 语义的场景,确保即使数组/映射为空或 NULL,主表的行也不会丢失。
  • 该函数可以直接在 SELECT 中使用,也可以与
    LATERAL VIEW
    LATERAL VIEW
    搭配使用。
联系我们
预约咨询
微信咨询
电话咨询
邮件咨询