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 친화적인 출력이 필요할 때
데이터 크기와 워크플로에 가장 잘 맞는 방법을 선택하면 됩니다.
참고 자료
- https://sparkbyexamples.com/pyspark/pyspark-tolist-function/ (opens in a new tab)
- https://www.mygreatlearning.com/blog/pyspark-how-to-convert-a-dataframe-tolist/ (opens in a new tab)
- https://sparkbyexamples.com/pyspark/pyspark-dataframe-to-pandas-dataframe/ (opens in a new tab)
자주 묻는 질문
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()