Databricks使用Local File API读取文本文件报FileNotFoundError问题问询
问题原因
DBFS是Databricks提供的分布式文件存储系统,Python原生open()属于本地文件系统API,仅能识别当前计算节点的本地路径,无法直接解析dbfs:前缀的分布式存储路径,也不能默认访问DBFS中的文件。而Spark原生适配DBFS协议,所以通过sc.textFile等Spark API可以正常读取对应文件。
可用解决方案
方案1:使用DBFS本地挂载路径读取
Databricks运行环境默认将DBFS根目录挂载到了驱动节点本地的/dbfs路径下,直接在原路径前添加/dbfs前缀即可通过本地文件API访问:
with open("/dbfs/FileStore/tables/boringwords.txt", "r") as f_read: for line in f_read: print(line)
该方案适配所有Python原生文件操作逻辑,适合小型文件的读取场景。
方案2:使用dbutils工具读取
Databricks内置的dbutils工具原生支持DBFS操作,可直接读取对应路径的文件内容:
# 读取文件内容,dbutils.fs.head默认最大读取64KB内容,适合小型文本文件 content = dbutils.fs.head("/FileStore/tables/boringwords.txt") for line in content.split("\n"): print(line.strip())
方案3:复用Spark读取结果
如果已经通过Spark RDD/DataFrame完成文件读取,可直接通过collect()方法将分布式数据转为驱动节点本地的Python对象处理,和你现有逻辑一致:
boring_words = sc.textFile("/FileStore/tables/boringwords.txt") word_set = set(i.strip() for i in boring_words.collect())
注意事项
- 仅Databricks Runtime 5.1及以上版本默认开启DBFS本地挂载,低于该版本的环境需先确认挂载配置
- 超过10MB的文件不推荐使用本地API读取,会占用驱动节点过多内存,优先使用Spark分布式处理
内容的提问来源于stack exchange,提问作者Riyaz Ali
相关产品推荐
相关产品推荐

