Databricks中%run场景下如何一致读取notebook关联的data.yml?
解决Databricks Notebook路径引用不一致问题
方法1:通过Spark配置获取当前Notebook的真实路径
在notebook1中,使用Spark内置配置项获取自身绝对路径,不受调用上下文影响:
import os from pyspark.sql import SparkSession spark = SparkSession.getActiveSession() # 获取notebook1的绝对路径 notebook_path = spark.conf.get("spark.databricks.notebook.path") # 提取notebook所在目录 notebook_dir = os.path.dirname(notebook_path) # 拼接同目录下的data.yml路径 data_path = os.path.join(notebook_dir, "data.yml") # 读取文件 with open(data_path, "r") as f: content = f.read() # 此处处理文件内容
该配置项会返回当前执行的notebook真实路径,无论notebook1是直接运行还是被notebook2通过%run调用,都能正确定位到alpha目录下的data.yml。
方法2:使用DBFS绝对路径(生产环境优先)
将data.yml存储到DBFS固定位置(比如/dbfs/alpha/data.yml),notebook1直接用绝对路径读取:
data_path = "/dbfs/alpha/data.yml" with open(data_path, "r") as f: content = f.read() # 此处处理文件内容
这种方式彻底规避路径上下文问题,适合稳定的生产环境,无需依赖notebook执行上下文。
方法3:通过%run传递目录参数
在notebook2调用notebook1时,手动传递notebook1的目录路径:
- notebook2中:
notebook1_dir = "/Workspace/alpha" %run ../alpha/notebook1 $notebook_dir=$notebook1_dir
- notebook1中:
import os # 接收传递的目录参数 data_path = os.path.join(notebook_dir, "data.yml") with open(data_path, "r") as f: content = f.read() # 此处处理文件内容
此方法需要调用方配合传递参数,适合临时调试或特殊场景。
内容的提问来源于stack exchange,提问作者Dror
相关产品推荐
相关产品推荐

