跳到主要内容
最后于 更新

STACK

SinceVersion dev

描述​

stack 将一组表达式拆分为固定数量的行。表达式按行优先顺序排列,与 Spark 和 Hive 的 stack 函数兼容。stack 需要与 LATERAL VIEW 配合使用,将生成的列添加到每个输入行中。

语法​

STACK(<num_rows>, <expr1> [, <expr2> ...])

参数​

参数描述
<num_rows>用于指定生成行数的正整数常量。支持 3 - 1 等常量表达式。
<expr1> [, <expr2> ...]要分配到生成行中的表达式。同一输出列中的非 NULL 表达式必须具有完全相同的类型;必要时请显式转换。表达式可以引用输入行中的列。

返回值​

返回 <num_rows> 行。输出列数等于表达式数量除以 <num_rows> 后向上取整的结果。每个输出列的类型为分配到该列的非 NULL 表达式的相同类型;如果某列只包含 NULL 表达式,则该列为 NULL 类型。值从左到右逐行分配。如果最后一行没有足够的表达式,缺少的值将使用 NULL 补齐。

生成多个输出列时,需要在 LATERAL VIEW 子句中指定别名来命名这些列。

使用说明​

  1. <num_rows> 必须是正整数常量。列引用、非整数、零或负数均无效。
  2. 对于每个输出列,分配到该列的非 NULL 表达式必须具有相同类型。只包含 NULL 表达式的列为 NULL 类型。
  3. 值按行优先顺序排列:第一个输出行获得每个输出列的第一个值,第二个输出行获得每个输出列的第二个值,以此类推。
  4. stack 是表生成函数,通常与 LATERAL VIEW 配合使用。

示例​

基本用法​

SELECT c1, c2
FROM (SELECT 1) t
LATERAL VIEW stack(2, 1, 2, 3) s AS c1, c2
ORDER BY c1, c2;
+------+------+
| c1 | c2 |
+------+------+
| 1 | 2 |
| 3 | NULL |
+------+------+

行优先排列​

SELECT c1, c2
FROM (SELECT 1) t
LATERAL VIEW stack(3, 1, 'a', 2, 'b', 3, 'c') s AS c1, c2
ORDER BY c1, c2;
+------+------+
| c1 | c2 |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+

如果表达式数量不足以填满最后一行,缺少的值为 NULL:

SELECT c1
FROM (SELECT 1) t
LATERAL VIEW stack(4, 1, 2, 3) s AS c1
ORDER BY c1;
+------+
| c1 |
+------+
| NULL |
| 1 |
| 2 |
| 3 |
+------+

列表达式和类型检查​

SELECT id, c1, c2
FROM (
SELECT 1 AS id, 10 AS a, 'x' AS s1, 20 AS b, 'y' AS s2
) AS test_stack
LATERAL VIEW stack(2, a, s1, b, s2) s AS c1, c2
ORDER BY id, c1, c2;
+------+------+------+
| id | c1 | c2 |
+------+------+------+
| 1 | 10 | x |
| 1 | 20 | y |
+------+------+------+

表达式会针对每个输入行求值。在本例中,a 和 b 组成一个输出列,s1 和 s2 组成另一个输出列。如果分配到同一输出列的表达式类型不兼容,查询将返回分析错误。

NULL 表达式可以与其他类型的值一起使用;NULL 值会在结果中作为补充值或原值保留。

显式 NULL 表达式会保留:

SELECT c1
FROM (SELECT 1) t
LATERAL VIEW stack(2, 1, NULL) s AS c1
ORDER BY c1;
+------+
| c1 |
+------+
| NULL |
| 1 |
+------+