DBFS与Volumes文件访问:Python与Spark读写问题解析
Databricks DBFS文件读取问题解答
问题场景
尝试通过Databricks文件系统(DBFS)读取日志文件时,使用Python标准open函数遇到路径相关困惑,最终通过Spark API成功读取文件内容。
初始失败代码
file_path = "\/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log" with open(file_path, 'r') as file: contents = file.read() print(contents)
终端显示的错误信息
bash: line 11: /Volumes/landing/default/artifacts/projects/use_case/databricks/scripts/proxy-init.sh: No such file or directory
成功读取的代码
file_path = "\/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log" from pyspark.sql import functions as F from pyspark.sql.functions import collect_list if dbutils.fs.ls(file_path): file_df_to_check = spark.read.text(file_path).agg(collect_list("value").alias("all_lines")) display(file_df_to_check)
问题解答
1. 为何第一段代码会出现指向Volume路径的错误?
这个错误并非open函数读取DBFS文件时抛出的,而是你要读取的日志文件本身的内容。该日志是集群初始化脚本的标准错误输出,记录的是初始化过程中脚本尝试访问/Volumes/.../proxy-init.sh文件时找不到目标的问题。你用open函数时可能因路径解析问题没成功读取到日志内容,但终端显示的错误其实是日志文件里的原有报错,和你的读取操作无关。
2. 文档中提到DBFS提供“volumes的访问协议”是什么含义?为何第一段代码无法正常工作?
DBFS的“volumes访问协议”指的是:DBFS提供了统一的路径范式,让你可以用/dbfs/Volumes/...或dbfs:/Volumes/...这样的路径直接访问Databricks Volumes(卷存储),无需关心Volumes底层对接的是云存储还是其他存储介质,实现了存储访问的统一抽象。
第一段代码无法工作的核心原因:
- Python标准
open函数只能访问集群节点的本地文件系统,/dbfs/是DBFS在Driver节点本地的挂载点,但这个挂载仅局限于Driver节点,且如果文件存储在DBFS中挂载点未覆盖的区域,open就无法找到文件。 - 你路径中的转义符
\/属于多余操作,正确的DBFS路径应直接写/dbfs/...或dbfs:/...,转义符会导致路径解析异常,进一步让open无法定位到正确的挂载路径。
3. 为何只能通过Spark读取该文件,而无法使用标准Python open函数?
- Spark API(如
spark.read.text)是直接对接DBFS的底层存储服务接口,不管文件存放在DBFS的哪个区域(包括Volumes、未挂载到本地的存储区域等)都能正常访问,且天生支持分布式存储的文件读取。 - Python的
open函数依赖DBFS在节点本地的挂载映射,仅能访问挂载范围内的文件,且如果在Worker节点执行(比如通过UDF调用),会因Worker节点没有DBFS挂载而直接失败。Spark则不依赖本地挂载,通过Databricks的存储服务直接访问DBFS,因此能稳定读取目标文件。
内容的提问来源于stack exchange,提问作者DataBach
相关产品推荐
相关产品推荐

