고급 집계: 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 예시는 원문 문서를 참고하세요.