최종 수정: 에
MAP_AGG
설명
MAP_AGG 함수는 여러 데이터 행의 키-값 쌍을 바탕으로 매핑 구조를 구성하는 데 사용됩니다.
중복 키가 있는 경우, MAP_AGG는 집계 중 처음 처리한 값을 유지하고 이미 존재하는 키의 후속 값은 무시합니다. 부분 집계 상태를 병합할 때도 대상 상태에 이미 있는 값을 유지합니다.
“처음 처리한 값”에서 “처음”은 삽입 순서가 아니라 처리 순서를 의미합니다. 스캔, 병렬 실행, 부분 상태의 병합 순서에 따라 유지되는 값이 달라질 수 있으므로, 중복 키에 대해 선택되는 값이 쿼리마다 동일하다고 보장되지 않습니다. 외부 ORDER BY는 결과 행만 정렬하며, 중복 키에 대해 어떤 값을 유지할지는 결정하지 않습니다.
구문
MAP_AGG(<expr1>, <expr2>)
매개변수
| 매개변수 | 설명 |
|---|---|
<expr1> | 키로 사용되는 표현식입니다. 지원되는 타입: Bool, TinyInt, SmallInt, Integer, BigInt, LargeInt, Float, Double, Decimal, Date, Datetime, String. |
<expr2> | 값으로 사용되는 표현식입니다. 지원되는 타입: Bool, TinyInt, SmallInt, Integer, BigInt, LargeInt, Float, Double, Decimal, Date, Datetime, String. |
반환 값
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"} |
+---------+