You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:23:15