表值函数 (TVF)

描述

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

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

支持的表值函数

可以在 FROM 子句中指定的 TVF

函数 参数类型 描述
range (end) Long 创建一个表,其中包含一个名为 idLongType 列,
包含范围从 0 到 end(不包括)且步长值为 1 的行。
range (start, end) Long, Long 创建一个表,其中包含一个名为 idLongType 列,
包含范围从 startend(不包括)且步长值为 1 的行。
range (start, end, step) Long, Long, Long 创建一个表,其中包含一个名为 idLongType 列,
包含范围从 startend(不包括)且步长值为 step 的行。
range (start, end, step, numPartitions) Long, Long, Long, Int 创建一个表,其中包含一个名为 idLongType 列,
包含范围从 startend(不包括)且步长值为 step 的行,并指定分区数 numPartitions

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

函数 参数类型 描述
explode (expr) Array/Map 将数组 expr 的元素分隔为多个行,或者将映射 expr 的元素分隔为多个行和列。 除非另有说明,否则对数组的元素使用默认列名 col,对映射的元素使用键和值。
explode_outer
(expr)
Array/Map 将数组 expr 的元素分隔为多个行,或者将映射 expr 的元素分隔为多个行和列。 除非另有说明,否则对数组的元素使用默认列名 col,对映射的元素使用键和值。
inline (expr) 表达式 将结构数组展开为表格。 默认情况下使用列名 col1、col2 等,除非另有说明。
inline_outer
(expr)
表达式 将结构数组展开为表格。 默认情况下使用列名 col1、col2 等,除非另有说明。
posexplode
(expr)
Array/Map 将数组 expr 的元素分隔为具有位置的多个行,或者将映射 expr 的元素分隔为具有位置的多个行和列。 除非另有说明,否则对于位置使用列名 pos,对于数组的元素使用 col,对于映射的元素使用键和值。
posexplode_outer (expr) Array/Map 将数组 expr 的元素分隔为具有位置的多个行,或者将映射 expr 的元素分隔为具有位置的多个行和列。 除非另有说明,否则对于位置使用列名 pos,对于数组的元素使用 col,对于映射的元素使用键和值。
stack (n, expr1, …, exprk) Seq[Expression] expr1, …, exprk 分隔为 n 行。 默认情况下使用列名 col0、col1 等,除非另有说明。
json_tuple
(jsonStr, p1, p2, …, pn)
Seq[Expression] 返回一个类似于函数 get_json_object 的元组,但它接受多个名称。 所有输入参数和输出列类型都是字符串。
parse_url
(url, partToExtract[, key])
Seq[Expression] 从 URL 中提取一部分。

示例

-- range call with end
SELECT * FROM range(6 + cos(3));
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

-- range call with start and end
SELECT * FROM range(5, 10);
+---+
| id|
+---+
|  5|
|  6|
|  7|
|  8|
|  9|
+---+

-- range call with numPartitions
SELECT * FROM range(0, 10, 2, 200);
+---+
| id|
+---+
|  0|
|  2|
|  4|
|  6|
|  8|
+---+

-- range call with a table alias
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('{"a":1, "b":2}', 'a', 'b');
+---+---+
| c0| c1|
+---+---+
|  1|  2|
+---+---+

SELECT parse_url('https://spark.apache.org/path?query=1', 'HOST');
+-----------------------------------------------------+
|parse_url(http://spark.apache.org/path?query=1, HOST)|
+-----------------------------------------------------+
|                                     spark.apache.org|
+-----------------------------------------------------+

-- Use explode in a LATERAL VIEW clause
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|
+--+--+