生成器函数
功能描述
生成器函数(Generator Functions)用于将单个输入行展开为多行输出。生成器函数与LATERAL VIEW配合使用,可以将数组或Map展开为多行。
函数列表
| 函数 | 描述 |
|---|---|
| collations() | 返回所有Spark SQL字符串排序规则(collation)信息。 |
| explode(expr) | 将数组展开为多行,或将Map展开为多行(key/value列)。 |
| explode_outer(expr) | 与explode类似,但输入为NULL或空数组时也输出一行(值为NULL)。 |
| inline(expr) | 将结构体数组展开为多行。每个结构体的字段成为独立的列。 |
| inline_outer(expr) | 与inline类似,但输入为NULL或空数组时也输出一行(值为NULL)。 |
| posexplode(expr) | 将数组展开为多行,同时输出元素的位置(从0开始)。 |
| posexplode_outer(expr) | 与posexplode类似,但输入为NULL或空数组时也输出一行。 |
| stack(n, expr1, ..., exprk) | 将expr1, ..., exprk分为n行输出。 |
| sql_keywords() | 返回Spark SQL关键字列表。 |
| json_tuple(jsonStr, p1, p2, ..., pn) | 从JSON字符串中提取指定字段的值,每个字段输出为一列。 |
示例
explode — 展开数组
SELECT explode(array(10, 20, 30)); -- 10 -- 20 -- 30
explode — 展开Map
SELECT explode(map('a', 1, 'b', 2));
-- key | value
-- a | 1
-- b | 2 explode_outer — 保留NULL行
SELECT explode_outer(array(NULL, 1, 2)); -- NULL -- 1 -- 2 -- 对比:explode遇到NULL数组元素会跳过 SELECT explode(array(1, 2)); -- 1 -- 2
posexplode — 带位置的展开
SELECT posexplode(array('a', 'b', 'c'));
-- pos | val
-- 0 | a
-- 1 | b
-- 2 | c inline — 展开结构体数组
SELECT inline(array(named_struct('a', 1, 'b', 2), named_struct('a', 3, 'b', 4)));
-- a | b
-- 1 | 2
-- 3 | 4 stack — 行转列
SELECT stack(2, 1, 2, 3, 4); -- col0 | col1 -- 1 | 2 -- 3 | 4
collations — 查看排序规则
SELECT * FROM collations() WHERE NAME = 'UTF8_BINARY'; -- CATALOG=SYSTEM, SCHEMA=BUILTIN, NAME=UTF8_BINARY, ...
sql_keywords — 查看SQL关键字
SELECT * FROM sql_keywords() LIMIT 2; -- keyword=ADD, reserved=false -- keyword=AFTER, reserved=false
json_tuple — 提取JSON字段
SELECT json_tuple('{"a":1, "b":2, "c":3}', 'a', 'b');
-- a | b-- 1 | 2 注意事项
- 生成器函数只能在SELECT列表中使用,且不能嵌套在其他表达式中。
- explode 与 explode_outer 的区别:当输入为NULL时,explode 不输出任何行,explode_outer 输出一行NULL。
- posexplode 的位置从0开始。
- stack 的参数个数必须是行数n的整数倍。
- 在LATERAL VIEW中使用生成器函数时,需要为展开的列指定别名。