그룹 집계와 피벗
groupBy()로 그룹을 정하고 agg() 안에 집계 표현식을 지정합니다. 그룹 열을 생략하면 전체 DataFrame을 하나의 집계 대상으로 사용합니다. 원래 행과 열을 유지하며 집계를 붙이려면 window를 사용합니다.
그룹별 최대와 평균
다음은 가상의 인구 자료입니다.
| state | city | city_population |
|---|---|---|
| WA | Bellevue | 100000 |
| WA | Seattle | 700000 |
| PA | Philadelphia | 1500000 |
| PA | Pittsburgh | 300000 |
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"))
피벗
피벗은 특정 열의 값을 결과 열로 바꾸고 각 그룹의 셀을 집계합니다.
| equipment | sensor | value |
|---|---|---|
| A | temperature | 60 |
| A | temperature | 40 |
| B | speed | 6 |
| A | speed | 3 |
def sensor_pivot(df):
return df.groupBy("equipment").pivot(
"sensor", ["temperature", "speed"]
).mean("value")
| equipment | temperature | speed |
|---|---|---|
| A | 50 | 3 |
| B | NULL | 6 |
예제는 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도 집계 연산으로 사용할 수 있습니다. 값이 여러 개일 때 임의 선택을 데이터 품질 보정으로 해석하지 않습니다.