最后于 更新
STACK
描述
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 子句中指定别名来命名这些列。
使用说明
<num_rows>必须是正整数常量。列引用、非整数、零或负数均无效。- 对于每个输出列,分配到该列的非
NULL表达式必须具有相同类型。只包含NULL表达式的列为NULL类型。 - 值按行优先顺序排列:第一个输出行获得每个输出列的第一个值,第二个输出行获得每个输出列的第二个值,以此类推。
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 |
+------+