表值函数 (TVF)

描述

表值函数 (TVF) 是返回一个关系或一组行的函数。Spark SQL 中有两种类型的 TVF:

  1. 可以在FROM子句中指定的TVF,例如range;
  2. 可以在SELECT/LATERAL VIEW子句中指定的TVF,例如explode。

支持的表值函数

可以在 FROM 子句中指定的 TVF:

函数 参数类型 描述
range ( end ) Long 创建一个只有一个名为 id LongType 列的表,
包含从 0 到 end (不包括)以步长 1 的行。
range ( start, end ) Long, Long 创建一个只有一个名为 id LongType 列的表,
包含从 start end (不包括)以步长 1 的行。
range ( start, end, step ) Long, Long, Long 创建一个只有一个名为 id LongType 列的表,
包含从 start end (不包括)以 step 值的行。
range ( start, end, step, numPartitions ) Long, Long, Long, Int 创建一个只有一个名为 id LongType 列的表,
包含从 start end (不包括)以 step 值的行,并指定分区数 numPartitions

可以在SELECT/LATERAL VIEW子句中指定的TVF:

函数 参数类型 描述
explode ( expr ) 数组/映射 将数组 expr 的元素分隔为多行,或将映射 expr 的元素分隔为多行和多列。除非另有指定,默认使用列名 col 表示数组的元素,或使用 key 和 value 表示映射的元素。
explode_outer
( expr )
数组/映射 将数组 expr 的元素分隔为多行,或将映射 expr 的元素分隔为多行和多列。除非另有指定,默认使用列名 col 表示数组的元素,或使用 key 和 value 表示映射的元素。
inline ( expr ) 表达式 将一个结构体数组展开成一个表。默认情况下,使用列名 col1, col2 等,除非另有指定。
inline_outer
( expr )
表达式 将一个结构体数组展开成一个表。默认情况下,使用列名 col1, col2 等,除非另有指定。
posexplode
( expr )
数组/映射 将数组 expr 的元素分隔为多个行并包含位置,或将映射 expr 的元素分隔为多行和多列并包含位置。除非另有指定,使用列名 pos 表示位置,col 表示数组的元素或 key 和 value 表示映射的元素。
posexplode_outer ( expr ) 数组/映射 将数组 expr 的元素分隔为多个行并包含位置,或将映射 expr 的元素分隔为多行和多列并包含位置。除非另有指定,使用列名 pos 表示位置,col 表示数组的元素或 key 和 value 表示映射的元素。
stack ( n, expr1, …, exprk ) Seq[表达式] expr1, …, exprk 分隔为 n 行。默认情况下,使用列名 col0, col1 等,除非另有指定。
json_tuple
( jsonStr, p1, p2, …, pn )
Seq[表达式] 返回一个元组,类似于函数 get_json_object ,但它接受多个名称。所有输入参数和输出列类型均为字符串。
parse_url
( url, partToExtract[, key] )
Seq[表达式] 从 URL 中提取一个部分。

示例

-- 使用结束范围调用
SELECT * FROM range(6 + cos(3));
+---+
| id|
+---+
| 0|
| 1|
| 2|
| 3|
| 4|
+---+
-- 使用起始和结束范围调用
SELECT * FROM range(5, 10);
+---+
| id|
+---+
| 5|
| 6|
| 7|
| 8|
| 9|
+---+
-- 使用 numPartitions 的范围调用
SELECT * FROM range(0, 10, 2, 200);
+---+
| id|
+---+
| 0|
| 2|
| 4|
| 6|
| 8|
+---+
-- 使用表别名的范围调用
SELECT * FROM range(5, 8) AS test;
+---+
| id|
+---+
| 5|
| 6|
| 7|
+---+
SELECT explode(array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+
SELECT inline(array(struct(1, 'a'), struct(2, 'b')));
+----+----+
|col1|col2|
+----+----+
| 1| a|
| 2| b|
+----+----+
SELECT posexplode(array(10,20));
+---+---+
|pos|col|
+---+---+
| 0| 10|
| 1| 20|
+---+---+
SELECT stack(2, 1, 2, 3);
+----+----+
|col0|col1|
+----+----+
| 1| 2|
| 3|null|
+----+----+
SELECT json_tuple(, , );
+---+---+
| c0| c1|
+---+---+
| 1| 2|
+---+---+
SELECT parse_url(, );
+-----------------------------------------------------+
|parse_url(http://spark.apache.org/path?query=1, HOST)|
+-----------------------------------------------------+
| spark.apache.org|
+-----------------------------------------------------+
-- 在 LATERAL VIEW 子句中使用 explode
CREATE TABLE test (c1 INT);
INSERT INTO test VALUES (1);
INSERT INTO test VALUES (2);
SELECT * FROM test LATERAL VIEW explode (ARRAY(3,4)) AS c2;
+--+--+
|c1|c2|
+--+--+
| 1| 3|
| 1| 4|
| 2| 3|
| 2| 4|
+--+--+