PySpark: DataFrame や Column を Python リストに変換する方法(初心者向けガイド)
Updated on
PySpark を扱っていると、分散処理されている Spark DataFrame をネイティブな Python オブジェクトへ変換したくなる場面がよくあります。
特にデバッグ、エクスポート、データ変換などの場面では、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), ...]各行をプレーンな Python リストに変換したい場合は:
[x.asDict().values() for x in df.collect()]または、各行を 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操作 - JSON との相性がよい出力には
to_dict("records")
データサイズとワークフローに合った方法を選んでください。
参考リンク
- 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()