Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Spark SQL 집계 함수

집계는 GROUP BY의 각 그룹에 값을 만듭니다. GROUP BY가 없으면 전체 입력을 대상으로 합니다. 출력에 사용할 계산 열에는 alias를 지정합니다.

함수와 인자의미와 조건
APPROX_COUNT_DISTINCT(expr[, relativeSD])HyperLogLog++ 기반 고유 개수 추정. 기본 relativeSD는 0.05
AVG(expr)숫자 값의 평균
COLLECT_LIST(expr)중복을 유지한 값 목록
COLLECT_SET(expr)중복을 제거한 값 목록
CORR(expr1, expr2)두 숫자 열의 Pearson 상관계수
COUNT(expr)NULL이 아닌 값의 수. COUNT(*)는 NULL을 포함한 행 수
COVAR_POP(expr1, expr2)모집단 공분산
COVAR_SAMP(expr1, expr2)표본 공분산
FIRST(expr[, ignoreNulls])먼저 처리된 값. 기본 ignoreNulls=False, True이면 비NULL 값을 선택
GROUPING(column)집계 집합에서 해당 열이 집계된 결과면 1, 아니면 0
KURTOSIS(expr)첨도
LAST(expr[, ignoreNulls])마지막에 처리된 값. 기본 ignoreNulls=False, True이면 비NULL 값을 선택
MAX(expr)최댓값
MEAN(expr)평균, AVG와 같은 역할
MIN(expr)최솟값
SKEWNESS(expr)왜도
STDDEV(expr)STDDEV_SAMP의 별칭
STDDEV_POP(expr)모집단 표준편차
STDDEV_SAMP(expr)n-1 보정을 적용한 표본 표준편차
SUM(expr)값의 합계
VARIANCE(expr)VAR_SAMP의 별칭, 표본 분산
VAR_POP(expr)모집단 분산
VAR_SAMP(expr)불편 표본 분산

relativeSD는 허용하는 상대 표준편차이며 개별 추정값이 실제 개수에서 항상 5% 이내라는 보장은 아닙니다. 고유 개수에 정확성이 필요하면 COUNT(DISTINCT expr)를 사용합니다.

FIRST/LAST는 모든 값이 NULL이면 NULL을 반환합니다. 그룹 집계가 처리하는 순서를 업무상의 첫/마지막 시각으로 간주하지 않습니다. COLLECT_LIST/COLLECT_SET의 목록 순서 역시 정렬 계약이 아닙니다.

행 수와 값 수 구분하기

다음은 실제 입력을 선언한 조회 예제입니다. category별 전체 행 수, 값이 있는 행 수와 평균을 각각 계산합니다.

SELECT
    category,
    COUNT(*) AS row_count,
    COUNT(value) AS value_count,
    AVG(value) AS average_value,
    MAX(value) AS maximum_value,
    COLLECT_LIST(value) AS values_with_duplicates
FROM VALUES ('A', 1.0), ('A', 3.0), ('A', NULL), ('B', 2.0) AS samples(category, value)
GROUP BY category

NULL을 세는 목적과 모든 행을 세는 목적에 같은 COUNT 표현식을 사용하지 않습니다. 서로 다른 여러 열 조합을 세려면 COUNT(DISTINCT expr1, expr2)처럼 지정할 수 있습니다.

GROUPING으로 합계 행 구분하기

GROUPING은 ROLLUP/CUBE 같은 집계 집합에서 사용합니다. 일반 데이터에 들어 있는 NULL과 집계가 만든 합계 행의 NULL을 구분하는 데 유용합니다.

SELECT
    category,
    GROUPING(category) AS is_total_row,
    SUM(value) AS total_value
FROM VALUES ('A', 10), ('B', 20) AS samples(category, value)
GROUP BY ROLLUP(category)

표본 통계는 표본 수가 부족하거나 계산이 정의되지 않는 경우를 고려해야 합니다. Spark 3.1 이후의 기본 통계 집계는 0으로 나누는 상황에서 NULL을 반환하며, 이전 버전이나 legacy 설정의 NaN 동작과 구분합니다.