变量赋值节点用于在工作流运行过程中改写调度变量的取值。上游节点把计算结果写入调度变量,工作流内后续运行的任意节点(包括间接下游)都能读到新值,无需在节点间逐层传递输出参数。
变量赋值节点是新版数据开发(DataStudio)的通用节点,仅支持在工作流内使用。
变量赋值节点与赋值节点不同:赋值节点通过节点上下文参数(outputs)传值,只能传给直接下游的一层节点;变量赋值节点通过调度变量传值,作用于整个工作流。二者的详细区别请参见本文的“与赋值节点的区别”。
使用限制
限制项 | 说明 |
版本要求 | 标准版及以上版本。 |
资源组 | 仅支持在 Serverless 资源组上运行。 |
使用范围 | 仅支持在工作流(含子工作流)中创建。普通任务不涉及调度变量,也无法创建该节点。 |
支持的语言 | Shell、Python3。 |
可改写的变量 | 仅限所在工作流已定义的调度变量。未定义的变量名不会被创建。 |
数据量 | 单次运行中变量数据总量上限 2 MB。 |
工作原理
在工作流的一次运行中,变量的传递遵循“读-写-传递”的模式,且每次运行都相互独立。
初始化:每次运行开始时,所有变量都会从您在调度配置中设定的初始值加载。
读取变量:在节点的代码中,您可以使用
${workflow.variable.变量名}的格式来读取变量的 当前值。写入变量:变量赋值节点通过在脚本中打印输出来 更新 变量的值。一旦节点成功运行,新值就会在本次运行中生效。
作用范围:变量的更新仅在 当前运行实例 中向下游传递。后续节点会获取到新值,但工作流的初始配置和其他运行实例不受任何影响。
赋值标记的解析发生在节点运行成功之后。节点运行失败时不会写回变量,后续节点读到的仍是改写前的值。
赋值标记格式
格式 | 语法 | 适用场景 |
单行 |
| 取值不含换行的普通场景。 |
多行 | 以 | 取值包含换行,如 JSON、多行告警文案。 |
Shell 示例:
#!/bin/bash
# 读取变量当前值
echo "current env: ${workflow.variable.env}"
# 单行写入,ds_flag为变量名
echo "##WORKFLOW_VARIABLE::ds_flag=20260903"
# 如需对参数进行换行,请使用多行写入,table1为变量名
echo "##WORKFLOW_VARIABLE_BEGIN::table1"
echo 'age'
echo 'name'
echo "##WORKFLOW_VARIABLE_END::table1"Python3 示例:
print("current ds_flag: " + "${workflow.variable.ds_flag}")
# 单行写入,ds_flag、chain_flag为变量名
print("##WORKFLOW_VARIABLE::ds_flag=20260904")
print("##WORKFLOW_VARIABLE::chain_flag=py-touched")
# 如需对参数进行换行,请使用多行写入,table1为变量名
print("##WORKFLOW_VARIABLE_BEGIN::table1")
print('age')
print('name')
print("##WORKFLOW_VARIABLE_END::table1")一个变量赋值节点中可以打印多条赋值标记,同时改写多个变量。
操作步骤
一、创建变量赋值节点
进入数据开发页面,双击目标工作流,进入工作流编辑画布。
单击添加节点,在通用类型中选择变量赋值,填写节点名称后确认创建。
配置上下游依赖关系,确定该节点在工作流中的运行位置。
说明变量改写只对该节点之后运行的节点生效,因此需要把消费新值的节点放在其下游。
二、编写改写逻辑
双击节点,进入代码编辑页面,在右页面下方切换计算语言(Shell 或 Python3)。
编写脚本:用
${workflow.variable.变量名}读取需要参与计算的变量,用赋值标记写入新值,赋值标记格式参见:赋值标记格式。保存节点。
只能给工作流上已定义的调度变量赋值。给未定义的变量赋值不会生效;若一条赋值标记都未匹配到已定义变量,节点运行失败。编辑代码时,界面会提示当前工作流可用的变量名。
取值为 JSON 等含引号的内容时,替换结果直接代入代码,需按宿主语言的语法规则包裹(Python 使用 """..."""),否则会触发脚本语法错误。
三、配置调度属性
变量赋值节点无法单独运行,需与其他节点配合使用,因此需要注意配置调度依赖关系。调度依赖配置可参见:调度依赖配置指引。
四、运行并验证
变量赋值节点仅支持在工作流上运行,不支持单独运行。
在工作流编辑画布单击运行,运行整条链路。
查看变量赋值节点的运行日志,确认赋值标记已被解析。
查看下游节点的运行日志,确认引用
${workflow.variable.变量名}得到的是改写后的值。
五、发布
测试无误后,提交并发布工作流至生产环境。变量赋值节点随工作流一并发布,生产调度时按相同规则改写变量。
六、在运维中心查看调度变量
工作流变量任务属性:展示变量定义与输出变量,可查看该节点会改写哪些变量。
工作流变量任务实例属性:展示执行变量与输出变量的具体值。
工作流内部任务实例的运行日志:打印本次运行读取到的执行变量值。变量被改写过时,日志会记录改写时间与执行改写的变量赋值节点;未被改写时展示初始值。
使用示例
请参见调度变量,查看完整使用示例。
与赋值节点的区别
对比项 | 变量赋值节点 | 赋值节点 |
传值载体 | 工作流的调度变量。 | 节点上下文参数( |
传值范围 | 所在工作流内、该节点之后运行的全部节点,包括间接下游。 | 仅直接下游的一层节点。 |
下游取值方式 | 代码中引用 | 下游需在节点上下文中添加输入参数并引用 |
支持的语言 | Shell、Python3。 | ODPS SQL、Python 2、Shell。 |
写值方式 | 打印赋值标记。 | 自动取最后一条查询或输出结果。 |
使用范围 | 仅工作流内。 | 工作流与普通任务均可。 |
需要把结果传给多层或多分支下游时使用变量赋值节点;仅需传给紧邻的一个下游节点,且希望沿用上下文参数的截取能力时使用赋值节点。
注意事项
作用域:调度变量与变量赋值节点均以工作流为边界,不同工作流之间互不可见。
执行顺序决定取值:变量的改写按节点实际运行顺序生效。并行分支之间没有先后保证,如果同时又两个变量赋值节点对同一个变量进行赋值,根据运行时间,后运行的节点会覆盖先运行的节点,需要确定取值时,通过依赖关系把节点串成先后顺序。为避免变量赋值时序混乱,请避免在工作流的两个分支中对同一个变量进行重复赋值。
只读语义:普通节点代码中引用调度变量为只读,无法通过普通节点修改变量取值,运行期改写只能通过变量赋值节点完成。
失败不写回:节点运行失败时不解析赋值标记,变量保持改写前的值。
未定义变量:引用未定义的变量不会报错,占位符原样保留在代码中参与执行,可能进一步引发脚本语法错误;改写未定义的变量不生效,全部不匹配时节点运行失败。
常见问题
Q:变量赋值节点的值可以传递给子工作流吗?
A:可以。工作流与子工作流均支持创建变量赋值节点。父工作流的调度变量值可以通过重置,将值传递给子工作流的调度变量。详情参见:父子工作流之间的变量传递。
Q:可以在调度参数的参数值里引用调度变量吗?
A:不可以。调度变量只能在节点代码中通过
${workflow.variable.变量名}引用。在调度参数(脚本参数)的参数值中书写该格式不会取到变量值。
Q:可以取变量值中的一部分吗?
A:不支持。调度变量不支持
${workflow.variable.变量名[0][1]}、${workflow.variable.变量名.name}这类截取或取子对象的写法。需要拆分取值时,在变量赋值节点中用 Shell 或 Python3 计算后,写入另一个变量供下游使用。
Q:改写的变量值会影响下一次调度吗?
A:不会。改写仅作用于本次运行。下一次调度仍从工作流调度配置中保存的初始值开始。
Q:一个节点可以同时改写多个变量吗?
A:可以。在同一个节点中打印多条赋值标记即可,单行与多行格式可以混用。