← 학습 카테고리

Learn

Spark

84개 모듈 · 현재 82번째

Spark 모듈 82/84 spark-learn-82

Aggregator API — 타입 안전한 집계 함수를 직접 만든다

Delta Lake RESTORE TABLE 및 Spark Aggregator API 공식 문서 종합 (웹 리서치, 2026) — Databricks 공식 문서(sql/language-manual/delta-restore), Apache Spark 공식 Javadoc(org.apache.spark.sql.expressions.Aggregator) Apache Spark 공식 Javadoc org.apache.spark.sql.expressions.Aggregator

이 모듈을 다 읽으면

  • Aggregator[IN, BUF, OUT] 세 타입 파라미터가 각각 무엇을 나타내는지 설명할 수 있다
  • zero/reduce/merge/finish 네 메서드의 역할을 설명할 수 있다

spark-learn-05에서 다룬 Dataset의 타입 안전(type-safe) API를 전제로, 그 타입 안전성을 커스텀 집계 함수에도 그대로 확장하는 Aggregator API를 정리한다.

세 타입 파라미터 — IN, BUF, OUT

Aggregator[-IN, BUF, OUT]는 spark-learn-05에서 다룬 Dataset의 타입 안전성을 집계 함수까지 확장한 것이다 — IN은 집계에 들어오는 입력 타입, BUF는 리듀스 과정에서 쓰이는 중간(버퍼) 값의 타입, OUT은 최종 결과 타입이다. 예를 들어 Employee 레코드들을 입력받아(IN=Employee) 부분합·개수를 담는 중간 타입(BUF=Average)을 거쳐 평균 급여(OUT=Double)를 내는 Aggregator를 만들 수 있다.

핵심 포인트

  • Aggregator[-IN, BUF, OUT]: IN(집계 입력 타입)/BUF(리듀스 중간 버퍼 타입)/OUT(최종 결과 타입) — Dataset의 타입 안전성을 집계 함수까지 확장
  • 예: Employee(IN) → Average 중간 버퍼(BUF) → 평균 급여 Double(OUT)

zero/reduce/merge/finish — 네 메서드의 역할 분담

zero는 집계의 초기값을 정의한다 — '어떤 값 + zero = 그 값 그대로'라는 항등원 조건을 만족해야 한다. reduce는 입력 레코드 하나를 현재 버퍼에 누적하는 함수다. merge는 (분산 처리로 나뉘어 계산된) 두 중간 버퍼 값을 하나로 합치는 함수다 — 파티션마다 독립적으로 reduce가 진행된 뒤, 그 결과들을 merge로 합쳐야 분산 집계가 완성된다. finish는 최종적으로 완성된 버퍼 값을 실제 출력 타입(OUT)으로 변환하는 함수다 — 위 예시라면 Average(합계, 개수) 버퍼를 실제 평균값(Double)으로 바꾸는 단계다. 완성된 Aggregator는 toColumn() 메서드로 TypedColumn으로 변환해야 Dataset.select나 KeyValueGroupedDataset.agg 같은 타입 안전 연산자와 함께 쓸 수 있다.

핵심 포인트

  • zero: 항등원 초기값 / reduce: 입력 레코드 하나를 버퍼에 누적 / merge: 분산 계산된 두 버퍼를 합침 / finish: 완성된 버퍼를 최종 OUT 타입으로 변환
  • 완성 후 toColumn()으로 TypedColumn 변환 필요 — Dataset.select/KeyValueGroupedDataset.agg 같은 타입 안전 연산자와 함께 사용