表格值函數 (TVF)

說明

表格值函數 (TVF) 會傳回關係或一組列。Spark SQL 中有兩種 TVF

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

支援的表格值函數

可以在 FROM 子句中指定的 TVF

函數 引數類型 說明
range ( end ) Long 建立一個表格,其中有一個名為 idLongType 欄位,
包含從 0 到 end (不含) 範圍內,步長為 1 的列。
range ( start, end ) Long, Long 建立一個表格,其中有一個名為 idLongType 欄位,
包含從 startend (不含) 範圍內,步長為 1 的列。
range ( start, end, step ) Long, Long, Long 建立一個表格,其中有一個名為 idLongType 欄位,
包含從 startend (不含) 範圍內,步長為 step 的列。
range ( start, end, step, numPartitions ) Long, Long, Long, Int 建立一個表格,其中有一個名為 idLongType 欄位,
包含從 startend (不含) 範圍內,步長為 step 的列,並指定分割區號碼 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.dev.org.tw/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|
+--+--+