Azure Databricks获取DBFS挂载点文件夹及文件最后修改日期异常问题
问题根因
你观察到的空文件夹修改日期错误是DBFS挂载ADLS Gen1的FUSE兼容层的缓存机制导致的:
- 递归调用
Path.iterdir()遍历父目录时,FUSE驱动会拉取子目录的元数据并更新本地缓存,空文件夹没有子文件/子目录,该拉取操作会误将缓存中该空文件夹的修改时间覆盖为当前遍历时间,后续调用getmtime返回的就是错误的缓存值。 - 硬编码路径直接查询时,没有触发父目录遍历的缓存更新逻辑,会直接请求ADLS Gen1服务端的原始元数据,因此返回的修改时间正确。
修复方案
不要使用基于POSIX的文件操作接口读取ADLS挂载路径的元数据,改用Databricks原生的dbutils.fs工具直接调用ADLS服务端API获取数据,不存在FUSE层缓存干扰,返回的修改时间完全准确,参考实现代码如下:
from datetime import datetime # 路径使用DBFS原生格式,无需带/dbfs前缀 root_dir = "/mnt/ADLS1/LANDING/parent" def scan_path(target_path): for entry in dbutils.fs.ls(target_path): # dbutils返回的修改时间是毫秒级时间戳,需要转成秒再处理 modify_date = datetime.fromtimestamp(entry.modificationTime / 1000).date() print(entry.path, modify_date) # 是文件夹则继续递归遍历 if entry.isDir(): scan_path(entry.path) scan_path(root_dir)
如果必须保留原有Path逻辑,可以在每次读取文件夹修改时间前,主动调用os.sync()清空FUSE缓存后再读取,但该方案性能远低于直接使用dbutils.fs,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者Gopesh
相关产品推荐
相关产品推荐

