表值函数 (TVF)
描述
表值函数 (TVF) 是返回关系或一组行的函数。 Spark SQL 中有两种类型的 TVF
- 可以在 FROM 子句中指定的 TVF,例如 range;
- 可以在 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) | 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|
+--+--+