Spark SQL----Table-valued Functions (TVF)

一、描述

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

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

二、支持的Table-valued函数

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

FunctionArgument Type(s)Description
range ( end )Long创建具有单个LongType列id的表,其中包含从0到end(不含)的行,步长为1。
range ( start, end )Long, Long创建具有单个LongType列id的表,其中包含从开始到结束(不包含)的行,步长值为1。
range ( start, end, step )Long, Long, Long创建具有单个LongType列id的表,其中包含从开始到结束(不包括)的具有步长值的行。
range ( start, end, step, numPartitions )Long, Long, Long, Int创建一个具有单个LongType列id的表,其中包含从开始到结束(不包括)的行,其中包含步长值,指定分区号numPartitions。

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

FunctionArgument Type(s)Description
explode ( expr )Array/Map将数组expr的元素分隔成多行,或将映射expr的元素分隔成多行和多列。除非另有指定,否则对数组的元素使用默认列名col,或者使用键和值表示map元素。
explode_outer ( expr )Array/Map将数组expr的元素分隔成多行,或将map expr的元素分隔成多行和多列。除非另有指定,否则对数组的元素使用默认列名col,使用键和值表示map元素。
inline ( expr )Expression将一个结构体数组分解为一个表。默认情况下使用列名col1, col2等,除非另有指定。
inline_outer ( expr )Expression将一个结构体数组分解为一个表。默认情况下使用列名col1, col2等,除非另有指定。
posexplode ( expr )Array/Map将数组expr的元素分成带有位置的多行,或将map expr的元素分成带有位置的多行和多列。除非另有指定,否则使用列名pos表示位置,使用列名col表示数组元素,或使用键和值表示map元素。
posexplode_outer ( expr )Array/Map将数组expr的元素分成带有位置的多行,或将map expr的元素分成带有位置的多行和多列。除非另有指定,否则使用列名pos表示位置,使用列名col表示数组元素,或使用键和值表示map元素。
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('http://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|
+--+--+
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值