DataWorks为您提供循环节点(do-while节点),您可以重新编排do-while节点内部的业务流程,将需要循环执行的逻辑写在节点内,再编辑end循环判断节点来控制是否退出循环。同时您也可以结合赋值节点来循环遍历赋值节点传递的结果集。本文通过实现简单和复杂场景的示例,为您介绍如何配置do-while节点。
前提条件
背景信息

使用限制与注意事项
- 循环支持
- 仅DataWorks标准版及以上版本支持使用do-while节点。
- do-while节点最多支持循环128次,end节点控制循环次数时,如果超过了128次,则运行会报错。
- 内部节点
- 自定义循环任务节点时,您可以删除内部节点间的依赖关系,重新编排循环节点内部业务流程,但需要分别将start节点、end节点分别作为do-while节点内部业务流程的首末节点。
- 在do-while节点的内部节点使用分支节点进行逻辑判断或者结果遍历时,需要同时使用归并节点。
- do-while节点的内部节点end节点在代码开发时,不支持添加注释。
- 调测运行
- DataWorks为标准模式时,不支持在DataStudio界面直接测试运行do-while节点。
如果您想测试验证do-while节点的运行结果,您需要将包含do-while节点的任务发布提交到运维中心,在运维中心页面运行do-while节点任务。如果您在do-while节点内使用了赋值节点传递的值,请在运维中心测试时,同时运行赋值节点和循环节点。
- 在运维中心查看do-while节点的执行日志时,您需要右键实例,单击查看内部节点来查看内部节点的执行日志。
- DataWorks为标准模式时,不支持在DataStudio界面直接测试运行do-while节点。
配置流程

- 配置节点依赖
do-while节点需要依赖赋值节点。
- 赋值结果集
赋值节点自带的节点上下文输出参数outputs,需作为do-while循环节点的节点上下文输入参数。
- do-while循环节点的内部节点获取参数
根据业务需求自定义do-while循环节点的内部业务流程,并在内部流程的节点中通过变量来获取所需参数值。
创建do-while节点
do-while节点的简单示例
本节为您介绍如何使用循环节点循环5次,并在每次循环中打印出当前的循环次数的端到端操作步骤。

循环节点的复杂示例
除上述简单场景外,您还会遇到通过循环的方式依次处理一组数据的每一行的复杂场景。实现该场景前,您需要满足以下条件:
- 需要部署一个上游节点,能够把查询出的数据输出给下游节点使用,您可以使用赋值节点实现该条件。
- 循环节点需要能够获取上游赋值节点的输出,您可以通过配置上下文依赖来实现该条件。
- 循环节点的内部节点需要能够引用到每一行的数据,增强已有的节点上下文,并额外下发了系统变量${dag.offset},可以帮您快速引用循环节点的上下文。
以下以一个具体的案例,为您示例复杂场景的配置步骤。
如上图所示:

- 赋值节点输出一个二维数组,将此二维数组传递给do-while循环节点。
二维数组的示例值为:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40岁 | 巨蟹座 | | 0016359814159 | 未知 | 30~40岁 | 巨蟹座 | +----------------------------------------------+
- do-while节点的内部节点通过变量来获取并打印当前循环参数、偏移量、上游赋值节点输入的参数值等。
总结
- 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开始标识该次循环相对于第一次循环的次数偏移量。