Databricks无法导出DataFrame为Excel 同逻辑CSV导出正常
问题根因
报错核心是路径不匹配:
pandas.DataFrame.to_excel()传入相对文件名时,默认将文件写入集群驱动节点的本地文件系统,默认存储路径是驱动节点的/databricks/driver/目录,不会自动写入DBFS存储。- 后续
dbutils.fs.cp('dbfs:/df_xl.xlsx', ...)操作的是DBFS分布式文件系统的根路径,该路径下根本不存在你生成的xlsx文件,因此抛出文件不存在异常。
同逻辑导出CSV能运行,是因为你导出CSV时大概率使用的是Spark DataFrame原生的write.csv()方法,该方法默认写入的就是DBFS路径,不存在路径错位问题。如果用pandas的to_csv()写相对路径,会出现完全一样的找不到文件报错。
可直接复用的解决方法
方法1:直接写入DBFS挂载路径(最简便)
Databricks默认将DBFS挂载到驱动节点的本地/dbfs/目录下,pandas写文件时直接传入该前缀的路径,生成的文件会直接存到DBFS中,后续dbutils可以直接读取:
path = 'abfss://raw@tkm.dfs.core.windows.net/db_folder/' # 写入时指定/dbfs/前缀的挂载路径 df1.to_excel('/dbfs/df_xl.xlsx', sheet_name='Sheet1', index=False) # 拷贝时注意目标路径要写全文件名,不要只写文件夹 dbutils.fs.cp('dbfs:/df_xl.xlsx', path + 'output/df_xl.xlsx')
方法2:从驱动本地路径拷贝
如果已经按原代码写了本地文件,dbutils操作本地文件时需要加file:协议前缀,指向驱动节点的实际存储路径:
path = 'abfss://raw@tkm.dfs.core.windows.net/db_folder/' df1.to_excel('df_xl.xlsx', sheet_name='Sheet1', index=False) # 本地文件路径加file:前缀,指向驱动节点默认工作目录 dbutils.fs.cp('file:/databricks/driver/df_xl.xlsx', path + 'output/df_xl.xlsx')
排查校验步骤
- 执行
%sh ls /databricks/driver/ | grep xlsx,确认驱动节点本地目录下是否成功生成了xlsx文件,排除to_excel执行失败(比如缺少openpyxl依赖)导致没有生成文件的情况 - 执行
dbutils.fs.ls('dbfs:/') | grep xlsx,确认DBFS路径下文件存在后再执行拷贝操作 - 拷贝到ADLS目标路径时,必须写全最终的文件名,不能只写到output文件夹层级,否则会出现文件命名异常、后续找不到的问题
内容的提问来源于stack exchange,提问作者Ambreen
相关产品推荐
相关产品推荐

