在Databricks数据湖读取最新文件时遇路径不存在错误排查
问题排查:Databricks读取挂载目录文件报PATH_NOT_FOUND
用户代码如下,用于从Databricks挂载的数据湖目录读取最新CSV文件:
directory_path = "dbfs:/mnt/x_file_directory" files = dbutils.fs.ls(directory_path) latest_file = max(files, key=lambda f:f.modificationTime) latest_file_path = latest_file.path df = spark.read.option("header", "true").option("inferSchema", "true") \ .csv(latest_file_path).toPandas()
运行时触发错误:
AnalysisException: [PATH_NOT_FOUND] Path does not exist: dbfs:/mnt/x_file_directory/file_name
以下是具体排查方向和解决办法:
1. 验证挂载点有效性
先确认挂载点是否正常存在,执行以下命令查看所有已挂载路径:
dbutils.fs.mounts()
如果/mnt/x_file_directory不在返回列表中,说明挂载失效或未正确创建,需要重新执行对应存储类型的挂载命令(如ADLS Gen2、S3等)。
2. 调整路径格式适配Spark读取
dbutils.fs.ls返回的路径带dbfs:前缀,但部分存储类型下,Spark读取需要使用/dbfs/的本地路径格式。尝试转换路径:
directory_path = "dbfs:/mnt/x_file_directory" files = dbutils.fs.ls(directory_path) file_list = [f for f in files if not f.isDir()] latest_file = max(file_list, key=lambda f:f.modificationTime) # 替换路径前缀适配Spark读取 latest_file_path = latest_file.path.replace("dbfs:", "/dbfs") df = spark.read.option("header", "true").option("inferSchema", "true") \ .csv(latest_file_path).toPandas()
3. 过滤目录,确保选中的是文件
dbutils.fs.ls会返回目录下的所有条目(包括子目录),如果选中的是子目录而非CSV文件,Spark读取会报错。添加过滤逻辑只保留文件:
directory_path = "dbfs:/mnt/x_file_directory" files = dbutils.fs.ls(directory_path) # 过滤出所有非目录的文件 file_list = [f for f in files if not f.isDir()] if not file_list: raise Exception("目标目录下无可用文件") latest_file = max(file_list, key=lambda f:f.modificationTime) latest_file_path = latest_file.path df = spark.read.option("header", "true").option("inferSchema", "true") \ .csv(latest_file_path).toPandas()
4. 检查文件访问权限
验证集群是否有读取该文件的权限:
# 尝试读取文件前100字节,测试权限 dbutils.fs.head(latest_file_path)
如果返回权限错误,需要调整存储服务的权限配置:比如ADLS需给服务主体分配「存储Blob数据读取者」角色;S3需给IAM角色添加s3:GetObject权限。
5. 排查文件名特殊字符问题
打印latest_file_path确认具体路径,检查是否包含空格、特殊字符:
print(latest_file_path)
如果路径有特殊字符,可尝试在Databricks UI中手动打开该路径验证,或重命名文件消除特殊字符后再测试。
内容的提问来源于stack exchange,提问作者user21635113
相关产品推荐
相关产品推荐

