Databricks中基于SQL查询生成多Excel文件报错求助
OSError: Errno 95: Operation not supported 问题排查与解决
核心原因
Errno 95本质是目标文件系统不支持openpyxl的写入操作,结合你的Spark集群场景,主要是以下几个问题导致:
排查与解决步骤
检查存储路径类型
如果filePath指向HDFS、S3这类分布式文件系统,直接用to_excel写入必然报错——openpyxl仅支持本地文件系统的读写操作。解决方法:先写入driver节点的本地临时目录,再通过集群工具(如hdfs dfs -put、aws s3 cp)同步到分布式存储。重构代码,避免低效的collect循环
当前用df_region.rdd.collect()把全量区域数据拉到driver节点循环过滤,不仅效率极低,还可能触发driver内存溢出。改用Spark的分区写入逻辑:# 关联订单数据和有效区域数据 df_joined = df.join(df_region, df.locId == df_region.Id, "inner") # 按locId分区写入临时parquet文件(Spark原生支持分布式存储) df_joined.write.partitionBy("locId").mode("overwrite").parquet("/tmp/temp_order_data") # 读取临时parquet,转存为Excel到本地再同步 import os from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() temp_parquet_dir = "/tmp/temp_order_data" # 遍历分区目录 for partition_dir in os.listdir(temp_parquet_dir): if partition_dir.startswith("locId="): regId = partition_dir.split("=")[1] # 读取单个分区的数据 part_df = spark.read.parquet(os.path.join(temp_parquet_dir, partition_dir)) # 本地临时Excel路径 local_excel_path = f"/tmp/excel_output/{regId}.xlsx" os.makedirs(os.path.dirname(local_excel_path), exist_ok=True) # 转存为Excel part_df.toPandas().to_excel(local_excel_path, index=False, engine='openpyxl') # 同步到目标存储(示例:HDFS) # os.system(f"hdfs dfs -put -f {local_excel_path} {filePath.format(locId=regId)}")验证driver节点的文件写入权限
在driver节点执行以下测试代码,确认本地文件系统可正常写入:import openpyxl test_wb = openpyxl.Workbook() test_wb.save("/tmp/test_openpyxl.xlsx")如果测试报错,说明driver节点的本地路径无写入权限,或文件系统(如NFS)存在兼容性问题。
简化代码细节
row.__getitem__('Id')可替换为更简洁的row.Id,但这不是报错的核心原因。
内容的提问来源于stack exchange,提问作者libpekin1847
相关产品推荐
相关产品推荐

