Skip to content

PySpark:将 DataFrame 或列转换为 Python List(新手友好指南)

Updated on

在使用 PySpark 时,经常需要把分布式的 Spark DataFrame 转换成原生的 Python 对象。
其中一个非常常见的需求——尤其是在调试、导出数据或做进一步数据处理时——就是把 PySpark DataFrame 转换为 Python list

虽然 PySpark 没有像 Pandas 那样的内置 .tolist() 方法,但根据数据集大小和内存限制,有多种可靠方式可以实现同样的效果。
本更新版指南会介绍:

  • 在 PySpark 中 “tolist” 的真实含义
  • 将 Spark DataFrame → Python list 的最佳实践方法
  • 处理单列 / 多列的不同方案
  • 性能与内存方面的注意事项
  • 小数据与大数据的完整代码示例

想要一个真正理解你 PySpark、Pandas 和 Jupyter 工作流的 AI 助手?

RunCell 是一个 JupyterLab AI agent,能读取你的代码、分析 DataFrame、理解 notebook 上下文、调试错误,甚至帮你生成并执行代码。
它直接集成在 JupyterLab 里——无需切换窗口或来回复制粘贴。

👉 试试 RunCell: https://www.runcell.dev (opens in a new tab)


在 PySpark 中,“tolist()” 是什么意思?

和 Pandas 不同,PySpark DataFrame 没有原生的 .tolist() 方法。

当 PySpark 用户提到 “tolist” 时,通常指的是下面几种情况:

✔ 方案 A — 把整个 DataFrame 转成 Python list

df.collect()

✔ 方案 B — 先转成 Pandas,再转成 list

df.toPandas().values.tolist()

✔ 方案 C — 把单个列转换为 Python list

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

本指南会通过清晰的示例逐一讲解这些方法。


方法一:将 PySpark DataFrame 转换为 Python List(适合小数据)

这是最常见的写法,但只适用于数据可以放进内存的场景。

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]]

方法二:在不使用 Pandas 的情况下把 DataFrame 转成 List(大数据推荐)

如果数据集比较大,一定要尽量避免使用 toPandas()
可以直接使用 Spark 的分布式 API:

df.collect()

返回结果类似:

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

如果想把每一行转换成普通的 Python list:

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

或者把每一行转换为字典:

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

方法三:将单个列转换为 Python List

这是极其常见的使用场景。

方案 A:使用 RDD(更快、更可扩展)

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

方案 B:使用 Pandas(适合小数据)

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

方法四:带索引的 DataFrame 转换为 Python List

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

转换为字典组成的 list:

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 操作:

  • 处理中到大型数据集
  • 只需要部分列
  • 希望避免 driver 端内存溢出

✔ 只转换你真正需要的内容

不要直接:

df.toPandas()

更好的写法:

df.select("col_of_interest")

小结

PySpark 虽然没有原生的 .tolist() 函数,但把 DataFrame 转换为 Python list 非常简单,可以通过以下方式实现:

  • toPandas().values.tolist() —— 适合小数据场景
  • collect()rdd 操作 —— 适合需要扩展性的大数据场景
  • to_dict("records") —— 适合需要 JSON 友好格式的输出

根据数据规模和工作流,选择最合适的方法即可。


参考资料


常见问题(FAQ)

1. 如何把 PySpark DataFrame 转成 Python list?

根据数据大小选择 df.collect()df.toPandas().values.tolist()

2. 如何把单个列转换为 list?

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

3. 如何把 Spark 的 Row 转换成 dict?

row.asDict()

相关 PySpark 教程