Skip to content

PySpark: DataFrame 또는 Column을 Python 리스트로 변환하기 (입문자용 가이드)

Updated on

PySpark로 작업하다 보면 분산된 Spark DataFrame을 파이썬의 기본 객체로 변환해야 할 때가 자주 있습니다.
특히 디버깅, 내보내기(export), 데이터 변환 과정에서는 PySpark DataFrame을 Python 리스트로 변환해야 하는 경우가 많습니다.

PySpark에는 Pandas처럼 내장된 .tolist() 메서드가 없지만, 데이터셋 크기와 메모리 제약에 따라 동일한 효과를 얻을 수 있는 신뢰할 만한 여러 방법이 있습니다.
이 업데이트된 가이드에서는 다음 내용을 다룹니다:

  • PySpark에서 “tolist”가 의미하는 것
  • Spark DataFrame을 Python 리스트로 변환하는 최선의 기법들
  • 단일 / 복수 컬럼 처리 방법
  • 성능 및 메모리 관점에서의 고려 사항
  • 소규모·대규모 데이터셋 모두를 위한 코드 예제

PySpark, Pandas, Jupyter 워크플로를 진짜로 이해하는 AI 에이전트를 찾고 있나요?

RunCell 은 코드와 DataFrame을 읽고, 노트북 컨텍스트를 이해하며, 에러를 디버깅하고, 심지어 코드를 생성·실행까지 해 주는 JupyterLab AI 에이전트입니다.
JupyterLab 안에서 바로 동작하므로, 창 전환이나 복붙이 필요 없습니다.

👉 RunCell 사용해 보기: https://www.runcell.dev (opens in a new tab)


PySpark에서 "tolist()"는 무슨 뜻인가?

Pandas와는 달리, PySpark DataFrame에는 내장 .tolist() 메서드가 존재하지 않습니다.

PySpark 사용자가 “tolist”라고 말할 때 보통 의미하는 것은 다음 중 하나입니다:

✔ 옵션 A — 전체 DataFrame을 Python 리스트로 변환

df.collect()

✔ 옵션 B — DataFrame을 Pandas로 바꾼 뒤, 리스트로 변환

df.toPandas().values.tolist()

✔ 옵션 C — 단일 컬럼을 Python 리스트로 변환

df.select("col").rdd.flatMap(lambda x: x).collect()

이 가이드에서는 위 모든 방법을 예제와 함께 차근차근 설명합니다.


방법 1: PySpark DataFrame을 Python 리스트로 변환 (소규모 데이터)

가장 흔하게 쓰이는 패턴이지만, 데이터셋이 메모리에 충분히 올라갈 수 있을 때만 사용해야 합니다.

df.toPandas().values.tolist()

예제

from pyspark.sql import SparkSession
 
spark = SparkSession.builder.appName("PySparkTutorial").getOrCreate()
 
data = [('Alice', 1), ('Bob', 2), ('Charlie', 3), ('David', 4)]
df = spark.createDataFrame(data, ['Name', 'Age'])
 
df.toPandas().values.tolist()

출력

[['Alice', 1], ['Bob', 2], ['Charlie', 3], ['David', 4]]

방법 2: Pandas 없이 Spark DataFrame을 리스트로 변환 (대규모 데이터 권장)

데이터셋이 큰 경우에는 항상 toPandas() 호출을 피해야 합니다.
대신 Spark의 분산 API를 사용합니다:

df.collect()

이 코드는 다음과 같은 결과를 반환합니다:

[Row(Name='Alice', Age=1), Row(Name='Bob', Age=2), ...]

이 Row들을 순수 Python 리스트로 바꾸려면:

[x.asDict().values() for x in df.collect()]

또는 각 Row를 dict로 변환하려면:

[row.asDict() for row in df.collect()]

방법 3: 단일 컬럼을 Python 리스트로 변환

매우 자주 등장하는 활용 사례입니다.

옵션 A: RDD 사용 (빠르고 확장 가능)

df.select("Name").rdd.flatMap(lambda x: x).collect()

옵션 B: Pandas 사용 (소규모 데이터)

df.toPandas()["Name"].tolist()

방법 4: 인덱스가 있는 DataFrame을 Python 리스트로 변환

PySpark DataFrame에는 기본 인덱스가 없으므로, 직접 컬럼을 추가해 인덱스를 만들 수 있습니다:

from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
 
df_index = df.withColumn(
    "index", row_number().over(Window.orderBy("Name"))
)
df_index.show()

이제 이를 dict들의 리스트로 변환:

df_index.toPandas().to_dict("records")

출력

[
 {'Name': 'Alice', 'Age': 1, 'index': 1},
 {'Name': 'Bob', 'Age': 2, 'index': 2},
 {'Name': 'Charlie', 'Age': 3, 'index': 3},
 {'Name': 'David', 'Age': 4, 'index': 4}
]

성능 관련 중요 메모 (꼭 읽기)

🚫 다음과 같은 경우 df.toPandas()는 피하세요:

  • 데이터셋이 큰 경우
  • 클러스터 메모리가 제한적인 경우
  • 컬럼에 대용량 바이너리 / 텍스트 데이터가 있는 경우

✔ 다음과 같은 경우 collect() 또는 RDD 연산을 사용하세요:

  • 중간~대규모 데이터로 작업할 때
  • 특정 컬럼만 필요할 때
  • 드라이버 메모리 과부하를 피하고 싶을 때

✔ 정말 필요한 것만 변환하기

다음처럼 전체를 변환하기보다는:

df.toPandas()

가능하면 이렇게 필요한 컬럼만 선택합니다:

df.select("col_of_interest")

정리

PySpark에는 내장 .tolist() 함수가 없지만, DataFrame을 Python 리스트로 변환하는 방법은 매우 단순합니다. 상황에 따라 다음을 사용할 수 있습니다:

  • toPandas().values.tolist() — 소규모 데이터셋용
  • collect() 또는 rdd 연산 — 확장 가능한 워크로드용
  • to_dict("records") — JSON 친화적인 출력이 필요할 때

데이터 크기와 워크플로에 가장 잘 맞는 방법을 선택하면 됩니다.


참고 자료


자주 묻는 질문

1. PySpark DataFrame을 Python 리스트로 변환하려면 어떻게 하나요?

데이터 크기에 따라 df.collect() 또는 df.toPandas().values.tolist()를 사용하면 됩니다.

2. 단일 컬럼을 리스트로 변환하는 방법은?

df.select("col").rdd.flatMap(lambda x: x).collect()

3. Spark Row를 dict로 변환하려면?

row.asDict()

관련 PySpark 가이드