Databricks保存PySpark DataFrame到本地报Job aborted错如何解决
Databricks导出10000行DataFrame到本地CSV报Job aborted解决方案
问题复现
执行如下导出代码时抛出org.apache.spark.SparkException: Job aborted.错误:
df_test.coalesce(1).write.csv("dbfs:/FileStore/tables/df_test", header=True, mode='overwrite')
目标是将10000行的DataFrame下载到本地设备。
优先推荐方案(适配10000行小数据量)
10000行数据体积极小,完全不需要走Spark分布式写入流程,直接将数据拉取到驱动节点转pandas生成单文件即可,从根源规避分布式写入的任务失败问题:
# 拉取数据到驱动节点转pandas DataFrame pdf = df_test.toPandas() # 直接写入DBFS路径生成单CSV文件 pdf.to_csv("/dbfs/FileStore/tables/df_test/df_test_final.csv", index=False)
写入完成后直接在DBFS文件浏览器找到对应文件点击下载即可。
其他报错场景对应修复方案
如果因为集群配置限制无法使用pandas写入,可根据具体报错原因选择对应修复方式:
问题1:
coalesce(1)单节点内存不足coalesce(1)不会做数据shuffle,强制把所有数据压到上游同一个Executor处理,当字段包含长文本、嵌套结构时很容易超出单节点内存阈值触发任务失败。
修复方式:- 替换
coalesce(1)为repartition(1),触发全量shuffle做数据均衡,单分区写入稳定性更高:df_test.repartition(1).write.csv("dbfs:/FileStore/tables/df_test", header=True, mode='overwrite') - 如果单分区写入始终失败,先取消单分区合并写入,后续再合并分片文件:
写入完成后通过shell命令合并分片,自动处理重复表头问题:# 先按默认分区写入 df_test.write.csv("dbfs:/FileStore/tables/df_test_raw", header=True, mode='overwrite')%sh # 创建目标目录 mkdir -p /dbfs/FileStore/tables/df_test # 提取第一个分片的表头写入最终文件 head -n 1 $(ls /dbfs/FileStore/tables/df_test_raw/part-*.csv | head -1) > /dbfs/FileStore/tables/df_test/df_test_final.csv # 追加所有分片的内容(跳过每个分片的表头行) tail -n +2 -q /dbfs/FileStore/tables/df_test_raw/part-*.csv >> /dbfs/FileStore/tables/df_test/df_test_final.csv
- 替换
问题2:写入路径权限异常/残留锁文件
/FileStore/tables是公共路径,之前写入失败残留的临时文件、锁文件,或者集群账号权限不足都会触发任务中止。
修复方式:- 写入前强制递归清理目标路径:
dbutils.fs.rm("dbfs:/FileStore/tables/df_test", recurse=True) - 更换写入路径到个人临时目录,避开公共路径权限冲突,比如写入
dbfs:/tmp/你的用户名/df_test。
- 写入前强制递归清理目标路径:
问题3:特殊字符导致CSV写入解析失败
字段中存在未转义的换行符、引号、分隔符时,CSV写入器解析失败会触发任务中止。
修复方式:写入时增加特殊字符转义配置:df_test.repartition(1).write.csv( path = "dbfs:/FileStore/tables/df_test", header = True, mode = "overwrite", quote = '"', escape = '"', multiLine = True )
本地下载注意事项
文件写入DBFS完成后,执行如下命令列出目标路径文件,点击对应CSV文件旁的下载按钮即可保存到本地:
display(dbutils.fs.ls("dbfs:/FileStore/tables/df_test"))
内容的提问来源于stack exchange,提问作者valentim.kodak
相关产品推荐
相关产品推荐

