윈도우잉과 분석 함수

윈도우잉과 분석 함수 (Windowing and Analytics)

Hive QL에 Hive 0.11 버전에서 도입된 윈도우잉(windowing)과 분석(analytics) 함수 기능 강화 문서예요. 모든 윈도우잉·분석 함수는 SQL 표준에 따라 동작합니다.

출처: 문서

본문

세부 사항은 "Windowing Specifications in HQL"(HIVE-4197에 첨부)를 참고하세요. HIVE-896에 초기 코멘트의 이전 문서 링크를 포함한 더 많은 정보가 있어요.

현재 릴리스는 다음 함수들을 윈도우잉·분석용으로 지원합니다.

윈도우잉 함수 (Windowing functions)

  • LEAD – 리드할 행 수를 선택적으로 지정할 수 있어요. 지정하지 않으면 리드는 한 행입니다. 현재 행의 리드가 윈도우 끝을 넘어가면 null을 반환합니다.
  • LAG – 래그할 행 수를 선택적으로 지정할 수 있어요. 지정하지 않으면 래그는 한 행입니다. 현재 행의 래그가 윈도우 시작보다 앞으로 넘어가면 null을 반환합니다.
  • FIRST_VALUE – 최대 두 개의 파라미터를 받아요. 첫 번째 파라미터는 첫 값을 원하는 컬럼이고, 두 번째(선택) 파라미터는 기본값이 false인 boolean이어야 합니다. true로 설정하면 null 값을 건너뜁니다.
  • LAST_VALUE – 최대 두 개의 파라미터를 받아요. 첫 번째 파라미터는 마지막 값을 원하는 컬럼이고, 두 번째(선택) 파라미터는 기본값이 false인 boolean이어야 합니다. true로 설정하면 null 값을 건너뜁니다.

OVER 절

  • 표준 집계와 함께: COUNT SUM MIN MAX AVG
  • 하나 이상의 파티셔닝 컬럼(어떤 원시 데이터 타입이든)을 가진 PARTITION BY 문과 함께
  • 하나 이상의 파티셔닝/정렬 컬럼(어떤 데이터 타입이든)을 가진 PARTITION BYORDER BY와 함께
  • 윈도우 명세(window specification)와 함께. 윈도우는 WINDOW 절에서 별도로 정의할 수 있어요.

윈도우 명세는 다음 형식을 지원합니다.

(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING
  • ORDER BY가 지정되고 WINDOW 절이 없으면, 윈도우 명세는 기본적으로 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW입니다.
  • ORDER BYWINDOW 절이 모두 없으면, 윈도우 명세는 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING으로 기본 설정됩니다.

OVER 절은 다음 함수들을 지원하지만, 이들과 함께 윈도우(windowing)는 지원하지 않아요 (HIVE-4797 참고).

  • 순위(ranking) 함수: Rank, NTile, DenseRank, CumeDist, PercentRank
  • LeadLag 함수

분석 함수 (Analytics functions)

  • RANK
  • ROW_NUMBER
  • DENSE_RANK
  • CUME_DIST
  • PERCENT_RANK
  • NTILE

Distinct 지원 (Hive 2.1.0 이상, HIVE-9534 참고)

SUM, COUNT, AVG를 포함한 집계 함수에 대해 distinct가 지원되며, 각 파티션 내의 distinct 값들에 대해 집계합니다. 현재 구현은 성능상 파티셔닝 절에 ORDER BY나 윈도우 명세를 지원하지 않는 제한이 있어요. 지원되는 구문은 다음과 같습니다.

COUNT(DISTINCT a) OVER (PARTITION BY c)

ORDER BY와 윈도우 명세는 Hive 2.2.0에서 distinct에 대해 지원돼요 (HIVE-13453 참고). 예:

COUNT(DISTINCT a) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

OVER 절의 집계 함수 지원 (Hive 2.1.0 이상, HIVE-13475 참고)

OVER 절 내에서 집계 함수를 참조하는 지원이 추가됐어요. 예를 들어 현재 OVER 절 안에서 SUM 집계 함수를 다음과 같이 사용할 수 있습니다.

SELECT rank() OVER (ORDER BY sum(b))
FROM T
GROUP BY a;

예시 (Examples)

SELECT 문에서 Hive QL 윈도우잉·분석 함수를 사용하는 예시입니다. 추가 예시는 HIVE-896을 참고하세요.

PARTITION BY 하나의 파티셔닝 컬럼, ORDER BY나 윈도우 명세 없음:

SELECT a, COUNT(b) OVER (PARTITION BY c)
FROM T;

PARTITION BY 두 개 파티셔닝 컬럼, ORDER BY나 윈도우 명세 없음:

SELECT a, COUNT(b) OVER (PARTITION BY c, d)
FROM T;

PARTITION BY 하나의 파티셔닝 컬럼, 하나의 ORDER BY 컬럼, 윈도우 명세 없음:

SELECT a, SUM(b) OVER (PARTITION BY c ORDER BY d)
FROM T;

PARTITION BY 두 개의 컬럼, 두 개의 ORDER BY 컬럼, 윈도우 명세 없음:

SELECT a, SUM(b) OVER (PARTITION BY c, d ORDER BY e, f)
FROM T;

파티셔닝, ORDER BY, 윈도우 명세:

SELECT a, SUM(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM T;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM T;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)
FROM T;
SELECT a, AVG(b) OVER (PARTITION BY c ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
FROM T;

한 쿼리에 여러 OVER 절이 있을 수 있어요. 단일 OVER 절은 바로 앞의 함수 호출에만 적용됩니다. 이 예시에서 첫 번째 OVER 절은 COUNT(b)에, 두 번째 OVER 절은 SUM(b)에 적용돼요:

SELECT 
 a,
 COUNT(b) OVER (PARTITION BY c),
 SUM(b) OVER (PARTITION BY c)
FROM T;

AS 키워드 유무와 관계없이 별칭(alias)을 사용할 수 있어요:

SELECT 
 a,
 COUNT(b) OVER (PARTITION BY c) AS b_count,
 SUM(b) OVER (PARTITION BY c) b_sum
FROM T;

WINDOW 절:

SELECT a, SUM(b) OVER w
FROM T
WINDOW w AS (PARTITION BY c ORDER BY d ROWS UNBOUNDED PRECEDING);

LEAD — 기본 1행 리드, 기본값 미지정:

SELECT a, LEAD(a) OVER (PARTITION BY b ORDER BY C)
FROM T;

LAG — 3행 래그, 기본값 0 지정:

SELECT a, LAG(a, 3, 0) OVER (PARTITION BY b ORDER BY C)
FROM T;

각 파티션에 대한 distinct 카운팅:

SELECT a, COUNT(distinct a) OVER (PARTITION BY b)
FROM T;

더 알아보기 (Learn more)

윈도우 함수는 OVER(...) 절 안에서 파티션·정렬·윈도우 경계를 조합해 강력한 집계를 만들어내요. RANK/ROW_NUMBER/LAG/LEAD와 함께 ROWS BETWEEN ... PRECEDING/FOLLOWING 문법을 익히면 시계열·순위 분석 쿼리를 쉽게 작성할 수 있습니다.