Skip to content

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")

データサイズとワークフローに合った方法を選んでください。


参考リンク


よくある質問

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 ガイド