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 友好格式的输出
根据数据规模和工作流,选择最合适的方法即可。
参考资料
- 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)
常见问题(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()