更新时间:2026-07-03 GMT+08:00
分享

生成器函数

功能描述

生成器函数(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中使用生成器函数时,需要为展开的列指定别名。

相关文档