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。
使用示例
-
展开数组,包含 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 |
+----+------+------+
-
对比
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 |
+----+-----+-----+
-
展开映射类型,包含 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
搭配使用。