如何获取Databricks中通过%run执行的子笔记本的上下文信息
问题核心原因
%run 属于内联执行模式,运行时会将子笔记本的所有代码完整插入到父笔记本的%run语句所在位置,在父笔记本的同一个执行进程内运行,因此默认调用dbutils.notebook.getContext()获取到的永远是父进程的上下文,也就是父笔记本的信息。
可行解决方案
方案1:使用dbutils.notebook.run()替代%run(推荐)
该方法会将子笔记本作为独立的任务触发运行,拥有独立的执行上下文,子笔记本内直接调用原有代码就能拿到自身的上下文:
- 父笔记本
notebook_1的代码调整为:
# notebook_1 # 第二个参数为任务超时时间(单位:秒),第三个为自定义传参,无传参需求可留空 dbutils.notebook.run("./notebook_2", 60)
- 子笔记本
notebook_2的代码无需改动,运行后打印的就是自身的上下文、笔记本ID等信息。
注意:该模式下父子笔记本的变量不互通,如果需要传递参数可以在第三个参数位置传入字典,子笔记本用dbutils.widgets.get()即可获取对应参数。
方案2:必须使用%run时的手动标记方案
如果因为需要共享变量等原因必须保留%run的内联模式,可以手动给子笔记本标记自身标识:
# notebook_2 import json # 提前写入当前笔记本的固定ID/路径,可在笔记本页面的URL或者详情页查询到 SELF_NOTEBOOK_ID = "你的notebook_2的实际ID" SELF_NOTEBOOK_PATH = "./notebook_2" def get_current_notebook_context(): base_context = json.loads(dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson()) # 追加子笔记本自身的标识信息 base_context["notebook_id"] = SELF_NOTEBOOK_ID base_context["notebook_path"] = SELF_NOTEBOOK_PATH return base_context context = get_current_notebook_context() print(context)
内容的提问来源于stack exchange,提问作者jiewpeng
相关产品推荐
相关产品推荐

