表值函数 (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`。
`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[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 中提取一部分。

可以在 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[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 * FROM explode(array(10, 20));
+---+
|col|
+---+
| 10|
| 20|
+---+

SELECT * FROM inline(array(struct(1, 'a'), struct(2, 'b')));
+----+----+
|col1|col2|
+----+----+
|   1|   a|
|   2|   b|
+----+----+

SELECT * FROM posexplode(array(10,20));
+---+---+
|pos|col|
+---+---+
|  0| 10|
|  1| 20|
+---+---+

SELECT * FROM stack(2, 1, 2, 3);
+----+----+
|col0|col1|
+----+----+
|   1|   2|
|   3|null|
+----+----+

SELECT * FROM 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 with LATERAL join
CREATE TABLE test (c1 INT);
INSERT INTO test VALUES (1);
INSERT INTO test VALUES (2);
SELECT * FROM test, LATERAL explode (ARRAY(3,4)) AS c2;
+--+--+
|c1|c2|
+--+--+
| 1| 3|
| 1| 4|
| 2| 3|
| 2| 4|
+--+--+