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

Azure Databricks使用Spark读取文件夹下Excel文件报PathNotFound错误如何解决

Azure Databricks 读取指定目录下所有Excel文件解决方案

报错原因

你遇到的PathNotFound error message: openFileForRead must be used with files and not directories报错,是因为crealytics spark excel 库默认将传入的路径作为单个文件处理,不支持直接传入目录路径读取全部文件,和Spark原生支持目录读取的csv、parquet格式逻辑不同。

解决方案

方案1:通配符匹配(适合同级目录下所有Excel文件读取,无需递归子目录)

直接在目录路径后拼接Excel文件后缀通配符即可,代码示例:

from pyspark.sql import functions as F

sSourcePath = "你的目录路径"
dfSource = spark \
  .read \
  .format("com.crealytics.spark.excel") \
  .option("Header", "true") \
  .option("inferSchema", "true") \
  .load(f"{sSourcePath}/*.xlsx") \ # 如需同时匹配xls格式,可修改为/*.xls*
  .withColumn("SourceFile",F.input_file_name())

方案2:遍历获取文件路径列表后批量读取(支持递归读取子目录内的Excel文件)

如果需要读取多层子目录下的所有Excel文件,可先遍历过滤出所有符合要求的文件路径,再传入load方法读取,代码示例:

from pyspark.sql import functions as F

# 递归遍历获取所有Excel文件路径
def get_all_excel_paths(root_path, suffix_list = [".xlsx", ".xls"]):
    file_paths = []
    for file_info in dbutils.fs.ls(root_path):
        if file_info.isDir():
            file_paths.extend(get_all_excel_paths(file_info.path, suffix_list))
        else:
            if any(file_info.path.endswith(suffix) for suffix in suffix_list):
                file_paths.append(file_info.path)
    return file_paths

sSourcePath = "你的目录路径"
excel_file_list = get_all_excel_paths(sSourcePath)

# 读取所有文件
dfSource = spark \
  .read \
  .format("com.crealytics.spark.excel") \
  .option("Header", "true") \
  .option("inferSchema", "true") \
  .load(excel_file_list) \
  .withColumn("SourceFile",F.input_file_name())

注意事项

  • 确保目录下所有Excel文件的表头、字段格式一致,否则schema推断可能出现字段类型不匹配的问题,复杂场景建议提前自定义schema传入,避免推断误差
  • 确认你使用的crealytics spark excel 库版本和当前Databricks Runtime版本兼容,避免出现版本不匹配导致的读写异常

内容的提问来源于stack exchange,提问作者Akshay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:12:01