You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks Notebook组件删除重建后仍用缓存值的问题求助

Databricks Widget删除重建后默认值不生效问题及跨语言参数共享方案

问题现象

在btq-sort评估Notebook中,执行删除并重建Widget的代码后,新Widget未使用设置的默认值temp2,仍返回旧值temp:

dbutils.widgets.text("widget_param", 'temp')

widget_param = dbutils.widgets.get("widget_param")
print(f'initial widget_param: {widget_param}')
# 输出:initial widget_param: temp

print('removing widget')
dbutils.widgets.remove("widget_param")

new_widget_value = 'temp2'
try:
    print('verifying widget removed')
    print(f'mlflow_run_id in widget: {dbutils.widgets.get("widget_param")}')
except Exception as e:
    print('Widget not set!')

# 输出:
# verifying widget removed
# Widget not set!

print(f'recreate widget with new default value: {new_widget_value}')
# 输出:recreate widget with new default value: temp2

dbutils.widgets.text("widget_param", defaultValue=new_widget_value)
print(f'New widget_param in widget: {dbutils.widgets.get("widget_param")}')
# 输出:New widget_param in widget: temp

问题原因

Databricks Widget的参数值和Notebook的会话状态绑定,删除后重建同名Widget时,平台会自动恢复之前会话中保存的旧参数值,而非使用新指定的defaultValue。这是因为Widget的状态属于Notebook执行上下文的一部分,并非完全独立的组件。

关于dbutils缓存

没有公开API可以直接清除dbutils的Widget缓存,dbutils的状态由Databricks平台内部管理,用户层面无法直接操作缓存。


解决方案

方案1:改用新的Widget名称

重建时使用不同的名称,避免触发旧会话值的恢复:

dbutils.widgets.remove("widget_param")
dbutils.widgets.text("widget_param_v2", defaultValue=new_widget_value)
print(f'New widget_param in widget: {dbutils.widgets.get("widget_param_v2")}')

方案2:重建后主动设置新值

即使使用同名Widget,重建后通过set方法主动覆盖旧值:

dbutils.widgets.remove("widget_param")
dbutils.widgets.text("widget_param", defaultValue=new_widget_value)
# 主动设置新值覆盖会话残留
dbutils.widgets.set("widget_param", new_widget_value)
print(f'New widget_param in widget: {dbutils.widgets.get("widget_param")}')

方案3:重置Notebook会话

点击Notebook右上角的「终止」按钮关闭当前执行会话,重新打开后执行代码,此时会话状态完全重置,重建的Widget会使用新的默认值。


跨%scala和%python环境共享参数

方法1:全局临时视图

Python写入参数:

spark.sql(f"CREATE OR REPLACE GLOBAL TEMP VIEW widget_params AS SELECT '{new_widget_value}' AS widget_param")

Scala读取参数:

val widgetParam = spark.sql("SELECT widget_param FROM global_temp.widget_params").first().getString(0)

方法2:Spark配置属性

Python设置参数:

spark.conf.set("custom.widget.param", new_widget_value)

Scala读取参数:

val widgetParam = spark.conf.get("custom.widget.param")

方法3:Spark上下文本地属性

Python设置参数:

spark.sparkContext.setLocalProperty("widget_param", new_widget_value)

Scala读取参数:

val widgetParam = spark.sparkContext.getLocalProperty("widget_param")

内容的提问来源于stack exchange,提问作者muon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:48:11