本文通过实现简单和复杂场景的示例,为您介绍如何配置do-while节点。
前提条件
您需要购买DataWorks标准版及以上版本,才可以使用do-while节点。
背景信息
您可以在do-while节点中定义相互依赖的任务,任务中包含一个名为end的循环判断节点。Dataworks会不断重复运行该批任务,直至循环判断节点end把判断结果置为false,Dataworks才会退出整个循环。
do-while节点支持ODPS SQL、SHELL和Python三种赋值语言。选择ODPS SQL赋值语言时,您可以通过
case when
语句进行判断。
说明 do-while节点最多可以循环128次,一旦超过便会报错。
创建do-while节点
- 进入数据开发页面。
- 登录DataWorks控制台。
- 在左侧导航栏,单击工作空间列表。
- 选择工作空间所在地域后,单击相应工作空间后的进入数据开发。
- 在数据开发页面,鼠标悬停至
图标,单击。您也可以打开相应的业务流程,右键单击通用,选择。
- 在新建节点对话框中,输入节点名称,并选择目标文件夹。
说明 节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。
- 单击提交。
do-while节点的简单示例
本节为您介绍如何使用循环节点循环5次,并在每次循环中打印出当前的循环次数:
- 双击do-while节点名称,打开节点的编辑页面。
do-while节点默认有
start、
sql和
end三个节点:
- start节点是一个循环开始的标记节点,并无业务作用。
- sql节点是Dataworks提供的一个业务处理节点示例,此处需要将其删除,替换为自己的业务处理Shell节点(打印当前循环次数)。
- end节点具有标记循环结束和判断是否开启下一次循环的功能,此处用于定义do-while节点的结束条件。
- 删除sql节点。
- 右键单击处于do-while节点中间的sql节点,单击删除节点。
- 在删除对话框中,单击确定。
- 创建并编辑Shell节点。
- 鼠标单击并拖拽至右侧的编辑页面。
- 在新建节点对话框中,输入节点名称。
注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
- 单击提交。
- 在do-while节点的编辑页面,通过拖拽连线,设置Shell节点的上游为start节点,下游为end节点。
- 双击Shell节点,进入Shell节点的编辑页面。
- 输入以下代码。
echo ${dag.loopTimes} ----打印循环的次数。

说明 Shell节点中的代码修改后请务必保存,提交时不会进行提示。如果未保存,最新的代码不能及时更新。
- 配置end节点。
- 双击打开end节点的编辑页面。
- 在请选择赋值语言下拉列表中,选中Python。
- 输入以下代码,定义do-while节点的结束条件。
if ${dag.loopTimes}<5:
print True;
else:
print False;
end节点本质上是一个赋值节点,仅输出true和false两种字符串,分别代表继续下一个循环和不再继续循环。
在打印循环次数和end节点中,都用到了${dag.loopTimes}变量。它是系统的保留变量,代表当前的循环次数,从1开始,do-while的内部节点可以直接引用该变量。
代码中把dag.loopTimes
和5进行比较,可以限制整体的循环次数。第一次循环dag.loopTimes为1、第二次为2,以此类推,第五次为5。至此表达式${dag.loopTimes}<5结果为false,退出循环。
- 单击节点编辑页面右侧的调度配置,配置节点的调度属性,详情请参见基础属性。
- 单击工具栏中的
图标。
- 提交do-while节点。
注意 您需要设置节点的重跑属性和依赖的上游节点,才可以提交节点。
- 单击工具栏中的
图标。
- 在提交对话框中,选中需要提交的节点,输入备注。
- 单击提交。
如果您使用的是标准模式的工作空间,提交成功后,请单击右上方的
发布。具体操作请参见
发布任务。
- 测试节点,并查看结果。
- 单击页面右上方的运维,进入运维中心。
- 在左侧导航栏,单击。
- 选中相应的节点,在右侧的DAG图中,右键单击赋值节点,选中。
- 刷新补数据实例页面,待补数据实例运行成功后,单击实例后的DAG图。
- 右键单击do-while节点,选中查看内部节点。

do-while节点的内部循环体分以下三部分:
- 视图左侧为do-while节点的重跑历史列表,只要do-while实例整体运行一次,历史列表便会产生一条相应的记录。
- 视图中部为循环记录列表,会列出当前do-while节点共运行多少次循环,以及每次循环的状态。
- 视图右侧为每次循环的具体信息,单击循环记录列表中的某次循环,即可展示出该循环每个实例的运行情况。
- 在内部节点页面,单击左侧的第3次,并右键单击Shell节点,选中查看运行日志。
在运行日志页面,查看第3次循环end节点的日志。

查看第5次循环end节点的日志。

第5次循环运行结束,退出循环。
由该示例可见,do-while节点的工作流程如下:
- 从start节点开始运行。
- 按照定义的任务依赖关系依次运行每个任务。
- 在end节点中定义循环的结束条件。
- 一组任务运行完毕之后,运行end的结束条件语句。
- 如果end的判断语句在日志中打印True,则从1开始继续下一个循环。
- 如果end的判断语句在日志中打印False,则退出整个循环,do-while节点整体结束。
循环节点的复杂示例
除上述简单场景外,您还会遇到通过循环的方式依次处理一组数据的每一行的复杂场景。实现该场景前,您需要满足以下条件:
- 需要部署一个上游节点,能够把查询出的数据输出给下游节点使用,您可以使用赋值节点实现该条件。
- 循环节点需要能够获取上游赋值节点的输出,您可以通过配置上下文依赖来实现该条件。
- 循环节点的内部节点需要能够引用到每一行的数据,增强已有的节点上下文,并额外下发了系统变量${dag.offset},可以帮您快速引用循环节点的上下文。
下文为您介绍如何通过循环节点,在每次循环中分别打印出表tb_dataset的每一行数据(c、0、1):
- 创建赋值节点并配置依赖关系。
本文需要添加一个赋值节点(数据集成初始化)为do-while节点的上游节点,产生测试数据集。
- 双击do-while节点所在的业务流程的名称,打开该业务流程的编辑页面。
- 鼠标单击赋值节点并拖拽至右侧的编辑页面。
- 在新建节点对话框中,输入节点名称。
注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
- 单击提交。
- 通过连线,配置赋值节点为do-while节点的上游节点。
- 双击do-while节点名称,打开节点的编辑页面,定义循环体。
do-while节点默认有start、sql和end三个节点,您需要删除sql节点并创建一个Shell节点:
- 右键单击处于do-while节点中间的sql节点,单击删除节点。
- 在删除对话框中,单击确定。
- 鼠标单击并拖拽至右侧的编辑页面。
- 在新建节点对话框中,输入节点名称。
注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
- 单击提交。
- 在do-while节点的编辑页面,通过拖拽连线,设置Shell节点的上游为start节点,下游为end节点。
- 单击节点编辑页面右侧的调度配置,在节点上下文区域,单击添加。设置参数名为input,取值来源为上游节点数据集初始化的outputs,即设置上游节点的outputs上下文为do-while节点的input。
- 编辑并保存Shell节点。
- 双击打开Shell节点的编辑页面,输入代码。
echo ${dag.input[${dag.offset}]}
- 单击工具栏中的
图标。
- 定义end节点的结束条件。
例如,比较变量
dag.loopTimes和
dag.input.length。如果
dag.loopTimes小于
dag.input.length,输出True并继续循环。如果不小于,则输出False并退出循环。

说明 变量dag.input.length标识的是上下文参数input数组的行数,是系统根据节点配置的上下文自动匹配的变量。
- 运行节点并查看结果。
总结
- do-while与while、for-each和do…while三种循环类型对比如下:
- do-while能够实现先循环再判断的循环体,即do…while语句,能够通过系统的变量dag.offset结合节点上下文间接实现foreach语句。
- do-while不能实现先判断再循环的方式,即while语句。
- do-while运行流程:
- 从start开始按任务依赖关系依次运行循环体中的任务。
- 运行用户在end节点中定义的代码。
- 如果end节点输出True,则继续下一个循环。
- 如果end节点输出False,则终止循环。
- 如何使用上下文依赖:do-while的内部节点可以通过${dag.上下文变量名}的方式引用到do-while节点定义的节点上下文。
- 系统参数:Dataworks会为do-while内部节点自动下发两个系统变量。
- dag.loopTimes:从1开始标识这一次循环的次数。
- dag.offset:从0开始标识该次循环相对于第一次循环的次数偏移量。