고급 집계: CUBE, GROUPING SETS, ROLLUP
고급 집계: CUBE, GROUPING SETS, ROLLUP (Enhanced Aggregation, Cube, Grouping and Rollup)
이 문서는 SELECT 문의 GROUP BY 절에서 사용할 수 있는 고급 집계 기능을 설명해요. 여러 차원의 조합으로 한 번에 집계 결과를 얻고 싶을 때 유용합니다.
출처: 문서
본문
SELECT 문의 GROUP BY 절을 위한 고급 집계 기능을 설명합니다.
버전 (Version)
GROUPING SETS, CUBE, ROLLUP 연산자와 GROUPING__ID 함수는 Hive 0.10.0에서 추가되었습니다. (HIVE-2397, HIVE-3433, HIVE-3471, HIVE-3613 참조) Hive 0.11.0의 개선 사항은 HIVE-3552도 참고하세요.
버전 (Version)
GROUPING__ID는 Hive 2.3.0부터 다른 SQL 엔진과 의미가 일치합니다 (HIVE-16102 참조). SQL grouping 함수에 대한 지원도 Hive 2.3.0에서 추가되었습니다 (HIVE-15409 참조).
GROUP BY에 대한 일반적인 내용은 Language Manual의 GroupBy 문서를 참고하세요.
GROUPING SETS 절 (GROUPING SETS clause)
GROUP BY의 GROUPING SETS 절은 같은 레코드 집합에서 두 개 이상의 GROUP BY 옵션을 지정할 수 있게 해 줍니다. 모든 GROUPING SET 절은 UNION으로 연결된 여러 GROUP BY 쿼리로 논리적으로 표현할 수 있습니다. 표 1은 그러한 동등한 문장 몇 가지를 보여줍니다. 이는 GROUPING SETS 절의 개념을 잡는 데 도움이 됩니다. GROUPING SETS 절의 빈 집합 ( )은 전체 집계를 계산합니다.
표 1 - GROUPING SET 쿼리와 그에 대응하는 GROUP BY 쿼리
| GROUPING SETS를 쓰는 집계 쿼리 | GROUP BY로 쓰는 동등한 집계 쿼리 |
|---|---|
SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) ) |
SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a) |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b UNION SELECT a, null, SUM( c ) FROM tab1 GROUP BY a |
SELECT a,b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS (a,b) |
SELECT a, null, SUM( c ) FROM tab1 GROUP BY a UNION SELECT null, b, SUM( c ) FROM tab1 GROUP BY b |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) ) |
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b UNION SELECT a, null, SUM( c ) FROM tab1 GROUP BY a, null UNION SELECT null, b, SUM( c ) FROM tab1 GROUP BY null, b UNION SELECT null, null, SUM( c ) FROM tab1 |
GROUPING__ID 함수 (GROUPING__ID function)
어떤 컬럼에 대해 집계가 표시될 때 그 컬럼의 값은 null입니다. 이는 그 컬럼 자체에 null 값이 있는 경우와 충돌할 수 있습니다. 컬럼의 null이 집계를 뜻하는지 실제 값을 뜻하는지 구분할 방법이 필요합니다. GROUPING__ID 함수가 그 해결책입니다.
이 함수는 각 컬럼이 존재하는지 여부에 대응하는 비트벡터(bitvector)를 반환합니다. 각 컬럼에 대해, 결과 집합의 어떤 행에서 그 컬럼이 집계되었다면 값 "1"이 생성되고, 그렇지 않으면 값 "0"이 생성됩니다. 이는 데이터에 null이 있을 때 이를 구분하는 데 사용할 수 있습니다.
다음 예를 생각해 봅시다.
| Column1 (key) | Column2 (value) |
|---|---|
| 1 | NULL |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 3 | NULL |
| 4 | 5 |
다음 쿼리:
SELECT key, value, GROUPING__ID, count(*)
FROM T1
GROUP BY key, value WITH ROLLUP;
| Column 1 (key) | Column 2 (value) | GROUPING__ID | count(*) |
|---|---|---|---|
| NULL | NULL | 3 | 6 |
| 1 | NULL | 1 | 2 |
| 1 | NULL | 0 | 1 |
| 1 | 1 | 0 | 1 |
| 2 | NULL | 1 | 1 |
| 2 | 2 | 0 | 1 |
| 3 | NULL | 1 | 2 |
| 3 | NULL | 0 | 1 |
| 3 | 3 | 0 | 1 |
| 4 | NULL | 1 | 1 |
| 4 | 5 | 0 | 1 |
여기서 세 번째 컬럼은 선택되는 컬럼들의 비트벡터입니다. 첫 번째 행에서는 아무 컬럼도 선택되지 않습니다. 두 번째 행에서는 첫 번째 컬럼만 선택되므로 값 1이 됩니다. 세 번째 행에서는 두 컬럼 모두 선택되는데(두 번째 컬럼은 우연히 null), 그래서 값 0이 됩니다.
grouping 함수 (Grouping function)
이 섹션은 원문 문서에서 GROUP BY와 함께 사용하는 GROUPING__ID 관련 함수들을 다룹니다.
더 알아보기 (Learn more)
- GROUPING SETS, CUBE, ROLLUP은 모두 여러 GROUP BY 조합을 한 번의 실행으로 만들어 줘요.
GROUPING__ID로 어떤 차원이 집계된 행인지 구분할 수 있습니다. 자세한 SQL 예시는 원문 문서를 참고하세요.