テーブル値関数(TVF)

説明

テーブル値関数(TVF)は、リレーションまたは行のセットを返す関数です。Spark SQL には 2 種類の TVF があります。

  1. FROM 句で指定できる TVF(例:range)
  2. SELECT/LATERAL VIEW 句で指定できる TVF(例:explode)

サポートされているテーブル値関数

FROM 句で指定できる TVF

関数 引数の型 説明
range ( end ) Long _id_ という名前の単一の _LongType_ 列を持つテーブルを作成し、
ステップ値 1 で 0 から _end_(排他)までの範囲の行を含みます。
range ( start, end ) Long, Long _id_ という名前の単一の _LongType_ 列を持つテーブルを作成し、
ステップ値 1 で _start_ から _end_(排他)までの範囲の行を含みます。
range ( start, end, step ) Long, Long, Long _id_ という名前の単一の _LongType_ 列を持つテーブルを作成し、
_step_ 値を使用して、_start_ から _end_(排他)までの範囲の行を含みます。
range ( start, end, step, numPartitions ) Long, Long, Long, Int _id_ という名前の単一の _LongType_ 列を持つテーブルを作成し、
_step_ 値を使用して、_start_ から _end_(排他)までの範囲の行を含み、パーティション番号 _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[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.dokyumento.jp/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|
+--+--+