Перейти к содержимому
Последнее обновление

STACK

SinceVersion dev

Описание​

stack распределяет список выражений по фиксированному числу строк. Выражения размещаются построчно, что совместимо с функциями stack в Spark и Hive. Используйте 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 |
+------+