テーブル値関数 (TVF)
説明
テーブル値関数 (TVF) とは、リレーションまたは行のセットを返す関数のことです。Spark SQL には 2 種類の 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 を指定します。 |
| explode ( expr ) | Array/Map | 配列 expr の要素を複数の行に展開するか、マップ expr の要素を複数の行と列に展開します。特に指定しない限り、配列の要素にはデフォルトで列名 col、マップの要素には key と value を使用します。 |
| explode_outer ( expr ) |
Array/Map | 配列 expr の要素を複数の行に展開するか、マップ expr の要素を複数の行と列に展開します。特に指定しない限り、配列の要素にはデフォルトで列名 col、マップの要素には key と value を使用します。 |
| inline ( expr ) | Expression | struct の配列をテーブルに展開します。特に指定しない限り、デフォルトで列名 col1、col2 などを使用します。 |
| inline_outer ( expr ) |
Expression | struct の配列をテーブルに展開します。特に指定しない限り、デフォルトで列名 col1、col2 などを使用します。 |
| posexplode ( expr ) |
Array/Map | 配列 expr の要素を位置情報付きの複数の行に展開するか、マップ expr の要素を位置情報付きの複数の行と列に展開します。特に指定しない限り、位置情報には列名 pos、配列の要素には col、マップの要素には key と value を使用します。 |
| posexplode_outer ( expr ) | Array/Map | 配列 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 ) | Array/Map | 配列 expr の要素を複数の行に展開するか、マップ expr の要素を複数の行と列に展開します。特に指定しない限り、配列の要素にはデフォルトで列名 col、マップの要素には key と value を使用します。 |
| explode_outer ( expr ) |
Array/Map | 配列 expr の要素を複数の行に展開するか、マップ expr の要素を複数の行と列に展開します。特に指定しない限り、配列の要素にはデフォルトで列名 col、マップの要素には key と value を使用します。 |
| inline ( expr ) | Expression | struct の配列をテーブルに展開します。特に指定しない限り、デフォルトで列名 col1、col2 などを使用します。 |
| inline_outer ( expr ) |
Expression | struct の配列をテーブルに展開します。特に指定しない限り、デフォルトで列名 col1、col2 などを使用します。 |
| posexplode ( expr ) |
Array/Map | 配列 expr の要素を位置情報付きの複数の行に展開するか、マップ expr の要素を位置情報付きの複数の行と列に展開します。特に指定しない限り、位置情報には列名 pos、配列の要素には col、マップの要素には key と value を使用します。 |
| posexplode_outer ( expr ) | Array/Map | 配列 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.dokyumento.jp/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|
+--+--+