变量赋值节点

更新时间:
复制 MD 格式

变量赋值节点用于在工作流运行过程中改写调度变量的取值。上游节点把计算结果写入调度变量,工作流内后续运行的任意节点(包括间接下游)都能读到新值,无需在节点间逐层传递输出参数。

说明

变量赋值节点是新版数据开发(DataStudio)的通用节点,仅支持在工作流内使用。

变量赋值节点与赋值节点不同:赋值节点通过节点上下文参数(outputs)传值,只能传给直接下游的一层节点;变量赋值节点通过调度变量传值,作用于整个工作流。二者的详细区别请参见本文的“与赋值节点的区别”。

使用限制

限制项

说明

版本要求

标准版及以上版本。

资源组

仅支持在 Serverless 资源组上运行。

使用范围

仅支持在工作流(含子工作流)中创建。普通任务不涉及调度变量,也无法创建该节点。

支持的语言

Shell、Python3。

可改写的变量

仅限所在工作流已定义的调度变量。未定义的变量名不会被创建。

数据量

单次运行中变量数据总量上限 2 MB。

工作原理

在工作流的一次运行中,变量的传递遵循“读-写-传递”的模式,且每次运行都相互独立。

  • 初始化:每次运行开始时,所有变量都会从您在调度配置中设定的初始值加载。

  • 读取变量:在节点的代码中,您可以使用 ${workflow.variable.变量名} 的格式来读取变量的 当前值。

  • 写入变量:变量赋值节点通过在脚本中打印输出来 更新 变量的值。一旦节点成功运行,新值就会在本次运行中生效。

  • 作用范围:变量的更新仅在 当前运行实例 中向下游传递。后续节点会获取到新值,但工作流的初始配置和其他运行实例不受任何影响。

说明

赋值标记的解析发生在节点运行成功之后。节点运行失败时不会写回变量,后续节点读到的仍是改写前的值。

赋值标记格式

格式

语法

适用场景

单行

##WORKFLOW_VARIABLE::变量名=值

取值不含换行的普通场景。

多行

##WORKFLOW_VARIABLE_BEGIN::变量名 起始,换行后写入内容,以 ##WORKFLOW_VARIABLE_END::变量名 结束。

取值包含换行,如 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")

一个变量赋值节点中可以打印多条赋值标记,同时改写多个变量。

操作步骤

一、创建变量赋值节点

  1. 进入数据开发页面,双击目标工作流,进入工作流编辑画布。

  2. 单击添加节点,在通用类型中选择变量赋值,填写节点名称后确认创建。

  3. 配置上下游依赖关系,确定该节点在工作流中的运行位置。

    说明

    变量改写只对该节点之后运行的节点生效,因此需要把消费新值的节点放在其下游。

二、编写改写逻辑

  1. 双击节点,进入代码编辑页面,在右页面下方切换计算语言(Shell 或 Python3)。

  2. 编写脚本:用 ${workflow.variable.变量名} 读取需要参与计算的变量,用赋值标记写入新值,赋值标记格式参见:赋值标记格式

  3. 保存节点。

说明

只能给工作流上已定义的调度变量赋值。给未定义的变量赋值不会生效;若一条赋值标记都未匹配到已定义变量,节点运行失败。编辑代码时,界面会提示当前工作流可用的变量名。

取值为 JSON 等含引号的内容时,替换结果直接代入代码,需按宿主语言的语法规则包裹(Python 使用 """..."""),否则会触发脚本语法错误。

三、配置调度属性

变量赋值节点无法单独运行,需与其他节点配合使用,因此需要注意配置调度依赖关系。调度依赖配置可参见:调度依赖配置指引

四、运行并验证

重要

变量赋值节点仅支持在工作流上运行,不支持单独运行。

  1. 在工作流编辑画布单击运行,运行整条链路。

  2. 查看变量赋值节点的运行日志,确认赋值标记已被解析。

  3. 查看下游节点的运行日志,确认引用 ${workflow.variable.变量名} 得到的是改写后的值。

五、发布

测试无误后,提交并发布工作流至生产环境。变量赋值节点随工作流一并发布,生产调度时按相同规则改写变量。

六、在运维中心查看调度变量

  • 工作流变量任务属性:展示变量定义与输出变量,可查看该节点会改写哪些变量。

  • 工作流变量任务实例属性:展示执行变量与输出变量的具体值。

  • 工作流内部任务实例的运行日志:打印本次运行读取到的执行变量值。变量被改写过时,日志会记录改写时间与执行改写的变量赋值节点;未被改写时展示初始值。

使用示例

请参见调度变量,查看完整使用示例。

与赋值节点的区别

对比项

变量赋值节点

赋值节点

传值载体

工作流的调度变量。

节点上下文参数(outputs)。

传值范围

所在工作流内、该节点之后运行的全部节点,包括间接下游。

仅直接下游的一层节点。

下游取值方式

代码中引用 ${workflow.variable.变量名},无需在下游配置参数。

下游需在节点上下文中添加输入参数并引用 outputs,再用 ${参数名} 取值。

支持的语言

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:可以。在同一个节点中打印多条赋值标记即可,单行与多行格式可以混用。