Azure Databricks写入Pandas DataFrame至DBFS Excel报错:OSError 95
问题分析与解决方案
核心原因
Azure Databricks的/dbfs路径是DBFS的FUSE挂载实现,底层依赖对象存储(如Azure Blob Storage),而对象存储不支持随机写入操作。Pandas的to_excel(基于openpyxl引擎)在保存文件时需要多次随机读写(比如修改文件元数据、写入工作表内容),因此会触发OSError: [Errno 95] Operation not supported;而to_csv是顺序写入,所以可以正常工作。
解决方案1:先写入集群本地磁盘,再拷贝到DBFS
集群本地磁盘(如/tmp)支持随机读写,适合Excel文件的生成,之后再将文件拷贝到DBFS。
import pandas as pd import shutil # 读取数据 url = 'https://www.stats.govt.nz/assets/Uploads/Business-price-indexes/Business-price-indexes-March-2019-quarter/Download-data/business-price-indexes-march-2019-quarter-csv.csv' data = pd.read_csv(url) # 写入集群本地临时目录 local_output_path = '/tmp/export.xlsx' with pd.ExcelWriter(local_output_path, engine="openpyxl") as writer: data.to_excel(writer) # 拷贝到DBFS(两种方式二选一) # 方式1:用shutil dbfs_output_path = '/dbfs/tmp/export.xlsx' shutil.copy(local_output_path, dbfs_output_path) # 方式2:用Databricks dbutils(推荐,更适配Databricks环境) dbutils.fs.cp(f'file:{local_output_path}', '/tmp/export.xlsx')
解决方案2:使用Spark Excel插件写入
通过Spark的第三方Excel插件直接写入DBFS,避免本地磁盘中转,适合大文件场景。
安装依赖库:在集群的"库"页面添加Maven包,坐标为
com.crealytics:spark-excel_2.12:0.13.7(适配Databricks Runtime 10.4的Scala 2.12版本)。执行代码:
import pandas as pd # 读取数据 url = 'https://www.stats.govt.nz/assets/Uploads/Business-price-indexes/Business-price-indexes-March-2019-quarter/Download-data/business-price-indexes-march-2019-quarter-csv.csv' data = pd.read_csv(url) # 将Pandas DataFrame转为Spark DataFrame spark_df = spark.createDataFrame(data) # 写入DBFS的Excel文件 spark_df.write.format("com.crealytics.spark.excel") \ .option("header", "true") \ .mode("overwrite") \ .save("/tmp/export_spark.xlsx")
额外验证步骤
确认openpyxl依赖正常:如果集群环境中openpyxl版本过低或缺失,也可能导致写入失败,可通过以下命令升级:
%pip install openpyxl --upgrade
内容的提问来源于stack exchange,提问作者Playing With BI
相关产品推荐
相关产品推荐

