PySpark DataFrame保存CSV报HADOOP_HOME未设,无管理员权限如何导出数据
可行解决方案
下面两个方案均符合你的限制条件,无需管理员权限,也不会占用超过内存阈值:
方案1:临时配置winutils(推荐,性能最优)
PySpark在Windows下写文件需要的Hadoop依赖实际只需要两个二进制文件,不需要完整安装Hadoop,也不需要修改系统环境变量:
- 下载与你PySpark3.2配套的Hadoop3.3.x版本的
winutils.exe和hadoop.dll,放到你拥有读写权限的普通用户目录下,比如C:\Users\你的用户名\winutils\bin,该操作无需管理员权限 - 在你代码的最开头、初始化SparkSession之前,添加如下代码临时设置环境变量:
import os # 路径替换为你存放winutils的上级目录(即bin文件夹的父目录) os.environ["HADOOP_HOME"] = r"C:\Users\your_username\winutils" os.environ["hadoop.home.dir"] = r"C:\Users\your_username\winutils"
配置完成后直接运行你原本的df.write.csv代码即可正常导出,性能和原生Spark写出一致。
方案2:逐分区迭代写出(无额外依赖)
如果不想下载额外文件,可以使用Spark的toLocalIterator按分区迭代数据,每次仅加载单个分区到内存,不会触发全量数据加载到内存,也不需要Hadoop依赖:
import csv # 获取数据表头 header = df.columns # 本地创建CSV文件写入 with open(r"C:\...\spark.csv", "w", newline="", encoding="utf-8") as f: csv_writer = csv.writer(f) # 写入表头 csv_writer.writerow(header) # 按分区迭代数据,逐行写入 for row in df.toLocalIterator(): csv_writer.writerow(list(row))
如果你的DataFrame分区数量过多,可以先调用df = df.repartition(5)(可根据你的内存大小调整分区数)再迭代,减少IO开销提升速度。
内容的提问来源于stack exchange,提问作者tiagottmoraes
相关产品推荐
相关产品推荐

