Databricks中Python单元格调用R函数及跨笔记本调用失效问题
问题原因
- 被调用的
test笔记本仅定义了checken()函数,没有在全局主动调用该函数。笔记本被dbutils.notebook.run触发执行时,只会运行顶层代码,未被调用的函数不会自动执行,因此不会生成新的结果文件,返回的始终是历史生成的旧文件内容。 - DBFS本地挂载路径(
/dbfs/开头的路径)存在客户端缓存,即使新文件已经写入,pandas读取时可能命中缓存返回旧内容。 dbutils.notebook.run使用相对路径调用笔记本时,可能匹配到其他路径下的旧同名笔记本,导致实际运行的不是修改后的目标笔记本。
解决方案
- 修改被调用的
test笔记本,在checken()函数定义的末尾新增一行checken(),主动触发函数执行。 - 规避DBFS缓存问题:
- 写入csv时添加
index=False参数避免冗余索引列,读取文件前可先通过os.path.getmtime('/dbfs/FileStore/tables/test.csv')确认文件修改时间是否符合预期 - 或直接使用带时间戳的唯一文件名作为中转文件,避免缓存命中,用完后可通过
dbutils.fs.rm删除临时文件
- 写入csv时添加
- 调用笔记本时使用绝对路径,例如
dbutils.notebook.run("/Workspace/Users/你的邮箱地址/test", 1800),避免路径匹配错误。 - 可选优化:无需通过中转文件传递参数,直接使用
dbutils.notebook.run的传参能力:- 调用方修改为
dbutils.notebook.run("目标笔记本绝对路径", 1800, {"test_value": -3}) - 被调用方通过
test = int(dbutils.widgets.get("test_value"))直接获取参数值,完全规避文件读写带来的各类问题。
- 调用方修改为
内容的提问来源于stack exchange,提问作者John de vries
相关产品推荐
相关产品推荐

