Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

그룹 집계와 피벗

groupBy()로 그룹을 정하고 agg() 안에 집계 표현식을 지정합니다. 그룹 열을 생략하면 전체 DataFrame을 하나의 집계 대상으로 사용합니다. 원래 행과 열을 유지하며 집계를 붙이려면 window를 사용합니다.

그룹별 최대와 평균

다음은 가상의 인구 자료입니다.

statecitycity_population
WABellevue100000
WASeattle700000
PAPhiladelphia1500000
PAPittsburgh300000
from pyspark.sql import functions as F


def state_statistics(df):
    return df.groupBy("state").agg(
        F.max("city_population").alias("largest_city_in_state"),
        F.avg("city_population").alias("average_population_in_state"),
    )

state별 최대값은 PA 1500000, WA 700000입니다. agg에는 여러 집계 표현식을 전달할 수 있습니다. max(city_population)처럼 괄호가 들어간 자동 이름 대신 출력과 후속 처리에 사용할 별칭을 명시합니다.

county 열도 있는 입력에서는 두 열로 묶을 수 있습니다. 전체 최대값은 빈 groupBy로 계산합니다.

from pyspark.sql import functions as F


def county_maximums(df):
    return df.groupBy("state", "county").agg(
        F.max("city_population").alias("largest_city_in_state_county")
    )


def overall_maximum(df):
    return df.groupBy().agg(F.max("city_population").alias("largest_city_overall"))

피벗

피벗은 특정 열의 값을 결과 열로 바꾸고 각 그룹의 셀을 집계합니다.

equipmentsensorvalue
Atemperature60
Atemperature40
Bspeed6
Aspeed3
def sensor_pivot(df):
    return df.groupBy("equipment").pivot(
        "sensor", ["temperature", "speed"]
    ).mean("value")
equipmenttemperaturespeed
A503
BNULL6

예제는 sensor 값 두 개와 출력 열 순서를 명시합니다. 값 목록을 생략한 pivot("sensor")도 사용할 수 있으며, 이때 엔진이 피벗 값을 알아내는 작업이 필요합니다.

집계 함수

아래 함수는 pyspark.sql.functions에서 가져옵니다.

함수의미
avg(col), mean(col)평균
collect_list(col)중복을 유지한 값 배열
collect_set(col)중복을 제거한 값 배열
count(col)해당 열의 NULL이 아닌 값 수. count("*")는 행 수
corr(x, y)Pearson 상관계수
covar_pop(x, y)모집단 공분산
covar_samp(x, y)표본 공분산
countDistinct(col, *cols)서로 다른 값 또는 열 조합의 개수
first(col, ignorenulls=False)그룹에서 먼저 처리된 값. True이면 NULL을 건너뜀
last(col, ignorenulls=False)그룹에서 마지막에 처리된 값. True이면 NULL을 건너뜀
grouping(col)rollup/cube 등 집계 집합에서 해당 열이 집계된 행인지 표시
grouping_id(*cols)집계 집합에서 열별 집계 여부를 비트로 표현
kurtosis(col)첨도
skewness(col)왜도
max(col), min(col)최댓값/최솟값
stddev(col)표본 표준편차
stddev_pop(col)모집단 표준편차
stddev_samp(col)n-1 보정을 적용한 표본 표준편차
sum(col)합계
sumDistinct(col)서로 다른 값의 합계. 현재 이름은 sum_distinct
var_pop(col)모집단 분산
var_samp(col)불편 표본 분산
variance(col)표본 분산

collect_list와 collect_set의 배열 순서, 그룹 집계 first/last의 선택을 원래 입력의 업무 순서로 간주하지 않습니다. Shuffle 뒤에는 순서가 달라질 수 있습니다. 특정 시각의 첫/마지막 레코드가 필요하면 명시적인 정렬 기준을 가진 window를 설계합니다.

피벗의 각 셀에 값이 하나뿐이라고 보장되는 경우에는 first도 집계 연산으로 사용할 수 있습니다. 값이 여러 개일 때 임의 선택을 데이터 품질 보정으로 해석하지 않습니다.