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

MAP_AGG

Описание​

Функция MAP_AGG используется для формирования отображения на основе пар ключ-значение из нескольких строк данных.

Для повторяющихся ключей MAP_AGG сохраняет значение, встретившееся первым при агрегации, и игнорирует последующие значения для уже существующего ключа. При слиянии частичных состояний агрегации также сохраняется значение, уже присутствующее в целевом состоянии.

«Встретившееся первым» относится к порядку обработки, а не к порядку вставки. Сканирование, параллельное выполнение и порядок слияния частичных состояний могут влиять на то, какое значение сохраняется, поэтому для повторяющегося ключа не гарантируется выбор одного и того же значения в разных запросах. Внешний ORDER BY только сортирует строки результата; он не определяет, какое значение сохраняется для повторяющегося ключа.

Синтаксис​

MAP_AGG(<expr1>, <expr2>)

Параметры​

ПараметрОписание
<expr1>Выражение, используемое в качестве ключа. Поддерживаемые типы: Bool, TinyInt, SmallInt, Integer, BigInt, LargeInt, Float, Double, Decimal, Date, Datetime, TimestampNs, Timestamptz, String и UUID.
<expr2>Выражение, используемое в качестве значения. Поддерживаемые типы: Bool, TinyInt, SmallInt, Integer, BigInt, LargeInt, Float, Double, Decimal, Date, Datetime, TimestampNs, Timestamptz, String и UUID.

Возвращаемое значение​

Возвращает значение типа Map. Если в группе нет допустимых данных, возвращает пустое отображение Map.

Пример​

-- setup
CREATE TABLE nation (
n_nationkey INT,
n_name STRING,
n_regionkey INT
) DISTRIBUTED BY HASH(n_nationkey) BUCKETS 1
PROPERTIES ("replication_num" = "1");
INSERT INTO nation VALUES
(0, 'ALGERIA', 0),
(1, 'ARGENTINA', 1),
(2, 'BRAZIL', 1),
(3, 'CANADA', 1);
select `n_regionkey`, map_agg(`n_nationkey`, `n_name`) from `nation` group by `n_regionkey`;
+-------------+-----------------------------------------+
| n_regionkey | map_agg(`n_nationkey`, `n_name`) |
+-------------+-----------------------------------------+
| 0 | {0:"ALGERIA"} |
| 1 | {1:"ARGENTINA", 2:"BRAZIL", 3:"CANADA"} |
+-------------+-----------------------------------------+
select map_agg(`n_name`, `n_nationkey` % 5) from `nation`;
+------------------------------------------------------+
| map_agg(`n_name`, `n_nationkey` % 5) |
+------------------------------------------------------+
| {"ALGERIA":0, "ARGENTINA":1, "BRAZIL":2, "CANADA":3} |
+------------------------------------------------------+
select map_agg(`n_name`, `n_nationkey` % 5) from `nation` where n_nationkey is null;
+--------------------------------------+
| map_agg(`n_name`, `n_nationkey` % 5) |
+--------------------------------------+
| {} |
+--------------------------------------+

Следующий запрос содержит повторяющийся ключ, поэтому результат содержит только одну пару ключ-значение. Результатом может быть {1:"a"} или {1:"b"} в зависимости от того, какое значение обрабатывается первым. Один из возможных вариантов вывода:

SELECT MAP_AGG(k, v) AS result
FROM (
SELECT 1 AS k, 'a' AS v
UNION ALL
SELECT 1 AS k, 'b' AS v
) AS input;
+---------+
| result |
+---------+
| {1:"a"} |
+---------+