Group By 절 — Hive 방언
Group By 절 — Hive 방언
Hive 방언의 Group by 절은 여러 입력 행에서 주어진 집계 함수로 단일 결과를 계산하는 데 사용합니다. ROLLUP/CUBE/GROUPING SETS를 사용한 고급 집계 기능도 지원합니다.
출처: 문서
본문
설명 (Description)
Group by 절은 주어진 집계 함수로 여러 입력 행에서 단일 결과를 계산하는 데 사용합니다. Hive 방언은 ROLLUP/CUBE/GROUPING SETS를 사용하여 동일한 레코드를 기반으로 여러 집계를 수행하는 고급 집계 기능도 지원합니다.
문법 (Syntax)
group_by_clause:
group_by_clause_1 | group_by_clause_2
group_by_clause_1:
GROUP BY group_expression [ , ... ] [ WITH ROLLUP | WITH CUBE ]
group_by_clause_2:
GROUP BY { group_expression | { ROLLUP | CUBE | GROUPING SETS } ( grouping_set [ , ... ] ) } [ , ... ]
grouping_set:
{ expression | ( [ expression [ , ... ] ] ) }
groupByQuery: SELECT expression [ , ... ] FROM src groupByClause?
group_expression에서 컬럼은 위치 번호로도 지정할 수 있습니다. 하지만 다음을 기억하세요:
- Hive 0.11.0 ~ 2.1.x에서는
hive.groupby.orderby.position.alias를 true로 설정합니다(기본값은 false) - Hive 2.2.0 이상에서는
hive.groupby.position.alias를 true로 설정합니다(기본값은 false)
파라미터 (Parameters)
GROUPING SETS
GROUPING SETS는 표준 GROUP BY로 기술할 수 있는 것보다 더 복잡한 그룹화 연산을 허용합니다. 지정된 각 그룹핑 셋(grouping set)별로 행이 별도로 그룹화되고, 단순 GROUP BY 절과 마찬가지로 각 그룹에 대해 집계가 계산됩니다.
모든 GROUPING SET 절은 논리적으로 UNION으로 연결된 여러 GROUP BY 질의로 표현될 수 있습니다.
예를 들어:
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
어떤 컬럼에 대해 집계가 표시될 때 그 값은 null입니다. 이는 컬럼 자체에 null 값이 있는 경우 충돌할 수 있습니다. 컬럼의 NULL(집계를 의미)과 컬럼의 NULL(데이터 값을 의미)을 구분할 방법이 필요한데, GROUPING__ID 함수가 그 해결책입니다.
이 함수는 각 컬럼이 존재하는지 여부에 해당하는 비트벡터를 반환합니다. 각 컬럼에 대해, 결과 집합의 어떤 행에서 그 컬럼이 집계되었다면 값 "1"이 생성되고, 그렇지 않으면 값 "0"이 생성됩니다. 이는 데이터에 null이 있을 때 구분하는 데 사용할 수 있습니다. 자세한 내용은 Hive 문서의 Grouping__ID function을 참고하세요.
또한 Grouping function은 주어진 행에 대해 GROUP BY 절의 표현식이 집계되었는지 여부를 나타냅니다. 값 0은 그룹핑 셋의 일부인 컬럼을, 값 1은 그룹핑 셋의 일부가 아닌 컬럼을 나타냅니다.
ROLLUP
ROLLUP은 일반적인 유형의 그룹핑 셋을 지정하는 축약 표기입니다. 주어진 표현식 목록과 그 목록의 모든 프리픽스(빈 목록 포함)를 나타냅니다.
예를 들어:
GROUP BY a, b, c WITH ROLLUP
는 다음과 동일합니다
GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ( )).
CUBE
CUBE는 일반적인 유형의 그룹핑 셋을 지정하는 축약 표기입니다. 주어진 목록과 그 가능한 모든 부분집합(멱집합, power set)을 나타냅니다.
예를 들어:
GROUP BY a, b, c WITH CUBE
는 다음과 동일합니다
GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( ))
예시 (Examples)
-- use group by expression
SELECT abs(x), sum(y) FROM t GROUP BY abs(x);
-- use group by column
SELECT x, sum(y) FROM t GROUP BY x;
-- use group by position
SELECT x, sum(y) FROM t GROUP BY 1; -- group by first column in the table;
-- use grouping sets
SELECT x, SUM(y) FROM t GROUP BY x GROUPING SETS ( x, ( ) );
-- use rollup
SELECT x, SUM(y) FROM t GROUP BY x WITH ROLLUP;
SELECT x, SUM(y) FROM t GROUP BY ROLLUP (x);
-- use cube
SELECT x, SUM(y) FROM t GROUP BY x WITH CUBE;
SELECT x, SUM(y) FROM t GROUP BY CUBE (x);