applyInPandasWithState — PySpark 네이티브 임의 상태 처리와 그 후속 transformWithState
Spark mapGroupsWithState/flatMapGroupsWithState 및 applyInPandasWithState 공식 문서 종합 (웹 리서치, 2026) — Apache Spark 공식 문서(streaming/structured-streaming-transform-with-state.html) + Databricks 공식 블로그(Python Arbitrary Stateful Processing) PySpark 공식 문서 GroupedData.applyInPandasWithState 및 Databricks 블로그 Python Arbitrary Stateful Processing
이 모듈을 다 읽으면
- applyInPandasWithState의 함수 시그니처가 spark-learn-61의 GroupState 개념을 Python/pandas로 어떻게 옮겼는지 설명할 수 있다
- Spark 4.0에서 transformWithState가 이를 대체하는 후속 API로 등장한 배경을 설명할 수 있다
spark-learn-61에서 다룬 mapGroupsWithState/flatMapGroupsWithState(Scala/Java 전용)를 전제로, Spark 3.4부터 PySpark에서 pandas 기반으로 같은 임의 상태 처리를 가능하게 해준 applyInPandasWithState와, Spark 4.0에서 이를 대체하는 transformWithState의 등장 배경을 정리한다.
함수 시그니처 — (key, Iterator[pandas.DataFrame], state)
applyInPandasWithState는 Spark 3.4.0부터 제공되며(Spark Connect 지원은 3.5.0부터), 사용자가 작성하는 함수가 (key, Iterator[pandas.DataFrame], state) 세 인자를 받아 Iterator[pandas.DataFrame]를 반환하는 시그니처를 갖는다 — key의 타입은 튜플이고, state의 타입은 spark-learn-61에서 다룬 것과 같은 계열의 pyspark.sql.streaming.state.GroupState다. 입력·출력 양쪽 모두 pandas.DataFrame의 크기와 개수가 임의적일 수 있어, 배치 단위로 여러 개의 작은 DataFrame을 받거나 낼 수 있다.
핵심 포인트
- 함수 시그니처: (key: 튜플, Iterator[pandas.DataFrame], state: GroupState) → Iterator[pandas.DataFrame]
- 입력·출력 모두 pandas.DataFrame의 크기·개수가 임의적 — spark-learn-61의 GroupState 개념을 Python/pandas 생태계로 그대로 옮긴 API
후속 세대 — Spark 4.0의 transformWithState
Spark 4.0부터는 transformWithState가 Structured Streaming의 새로운 임의 상태 연산자로 도입돼, Python 쪽에서 applyInPandasWithState의 차세대 대체재 역할을 한다 — 공식 문서도 이를 명시적으로 '차세대 대체(next generation replacement)'라고 표현한다. 다만 applyInPandasWithState 자체가 당장 제거된 것은 아니고 여전히 계속 쓸 수 있는 상태다. 즉 mapGroupsWithState/flatMapGroupsWithState(Scala/Java) → applyInPandasWithState(Python, 3.4+) → transformWithState(4.0, 차세대)로 이어지는 진화 계보로 이해하는 게 정확하다.
핵심 포인트
- Spark 4.0의 transformWithState가 applyInPandasWithState의 '차세대 대체'로 공식 문서에 명시됨 — 다만 applyInPandasWithState가 즉시 제거된 건 아니고 계속 사용 가능
- 진화 계보: mapGroupsWithState/flatMapGroupsWithState(Scala/Java) → applyInPandasWithState(Python, 3.4+) → transformWithState(4.0, 차세대)