DataWorks为您提供循环节点(do-while节点),您可根据业务需要重新编排循环节点内部业务流程,将需要循环执行的业务逻辑放入循环节点内部,并通过循环节点内部的end节点来定义循环条件,即确认不满足何种条件的情况下退出循环。循环节点可单独使用,也可结合赋值节点来循环遍历赋值节点传递的结果集。本文为您介绍do-while节点的组成与应用逻辑。
背景信息
说明 | 相关文档 |
---|---|
了解循环节点(do-while节点)使用限制与注意事项,例如循环次数上限、如何测试与如何查看日志。 | 使用限制、注意事项 |
了解循环节点(do-while节点)内部可根据业务需要自定义循环节点内部业务流程,但要求待循环业务流程开始节点需要为自带的start节点,业务流程结束节点需要为节点自带的end节点。 | 节点组成与流程编排 |
了解循环节点(do-while节点)提供内置变量可获取每次循环的相关参数,并提供取值案例加强理解。 | 内置变量、取值案例 |
了解循环节点通过END节点控制是否退出循环,并提供退出循环的END节点代码示例。 | 退出循环示例:end节点代码样例 |
推荐循环节点(do-while节点)典型应用场景。 | 应用场景1:与赋值节点联合使用、应用场景2:与分支节点、归并节点联合应用 |
使用限制
- 仅DataWorks标准版及以上版本支持使用do-while节点。详情请参见DataWorks各版本详解。
- do-while节点循环次数上限为128次。
- 不支持并发执行。即上次循环完成后才可进入下一次循环。
注意事项
维度 | 分类 | 说明 |
---|---|---|
循环支持 | 循环次数上限 | do-while节点最多支持循环128次,end节点控制循环次数时,如果超过了128次,则运行会报错。 |
内部节点 | 流程编排 |
|
取值 | 提供内置变量来取上游赋值节点的指定的值。 | |
调试运行 | 任务调试 | DataWorks为标准模式时,不支持在DataStudio界面直接测试运行do-while节点。 如果您想测试验证do-while节点的运行结果,您需要将包含do-while节点的任务发布提交到开发环境运维中心,在开发环境运维中心页面运行do-while节点任务。 |
查看日志 | 在运维中心查看do-while节点的执行日志时,您需要右键实例,单击查看内部节点来查看内部节点的执行日志。 | |
上下游依赖 | 依赖设置 | 循环节点可单独使用,也可结合赋值节点使用,在运维中心执行任务时,选择补数据功能,并同时选中执行赋值节点与循环节点,单独运行循环节点将无法获取到赋值节点传递的值。 |
节点组成与流程编排

- start节点
代表循环开始,不承载具体的任务代码,循环节点内部具体待循环执行的任务节点均需要直接或间接依赖该start节点,且不支持删除。
- 循环逻辑
DataWorks默认为您创建好了一个SQL类型的内部任务运行节点,您也可以删除默认的sql节点后,根据实际情况重新构建循环节点内部待循环的业务流程。
通常循环任务的业务流程会与赋值节点、分支节点、归并节点联合使用,自定义循环任务节点时,您可以删除内部节点间的依赖关系,重新编排循环节点内部业务流程,但需要分别将start节点、end节点分别作为do-while节点内部业务流程的首末节点。
- end节点
- end节点是do-while节点的循环判断节点,来控制do-while节点循环次数,其本质上是一个赋值节点,输出
true
和false
两种字符串,分别代表继续下一个循环和不再继续循环。 - end节点支持使用ODPS SQL、SHELL和Python(Python2)三种语言进行循环判断代码开发,同时do-while节点为您提供了便利的内置变量,便于您进行end代码开发。内置变量的介绍请参见内置变量和取值案例,不同语言开发的样例代码请参见退出循环示例:end节点代码样例。
- 循环节点内部具体待循环执行的任务节点均需要直接或间接为该end的节点上游,且不支持删除该节点。
- end节点是do-while节点的循环判断节点,来控制do-while节点循环次数,其本质上是一个赋值节点,输出
内置变量
内置变量 | 含义 | 取值 |
---|---|---|
${dag.loopTimes} | 当前已循环次数 | 第一次循环为1、第二次为2、第三次为3…第n次为n。 |
${dag.offset} | 偏移量 | 第一次循环为0、第二次为1、第三次为2…第n次为n-1。 |
input
是do-while节点中自定义的本节点输入参数名称,实际使用时,需替换为您真实的名称。内置变量 | 含义 |
---|---|
${dag.input} | 上游赋值节点传递的数据集。 |
${dag.input[${dag.offset}]} | 循环节点内部获取当前循环的数据行。 |
${dag.input.length} | 循环节点内部获取数据集长度。 |
取值案例
案例1:上游赋值节点为Shell语法
- 节点输出
上游赋值节点为Shell语法,最后一条输出结果为
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01
。 - 变量取值
内置变量 第1次循环时取值 第2次循环时取值 ${dag.input}
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01
${dag.input[${dag.offset}]}
2021-03-28
2021-03-29
${dag.input.length}
5 ${dag.loopTimes}
1 2 ${dag.offset}
0 1
案例2:上游赋值节点为ODPS SQL语法
- 节点输出上游赋值节点为ODPS SQL语法,最后一条select语句查询出两条数据:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40岁 | 巨蟹座 | | 0016359814159 | 未知 | 30~40岁 | 巨蟹座 | +----------------------------------------------+
- 变量取值
内置变量 第1次循环时取值 第2次循环时取值 ${dag.input}
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40岁 | 巨蟹座 | | 0016359814159 | 未知 | 30~40岁 | 巨蟹座 | +----------------------------------------------+
${dag.input[${dag.offset}]}
0016359810821,湖北省,30~40岁,巨蟹座
0016359814159,未知,30~40岁,巨蟹座
${dag.input.length}
2 说明 二维数组的行数为数据集长度,当前赋值节点输出的二维数组行数为2。${dag.input[0][1]}
说明 二维数组的第一行第一列的取值。0016359810821
${dag.loopTimes}
1 2 ${dag.offset}
0 1
退出循环示例:end节点代码样例
end节点支持使用ODPS SQL、SHELL和Python(Python2)三种语言进行循环判断代码开发,以下为您示例三种不同语言下,典型的代码样例。
使用ODPS SQL语言
SELECT CASE
WHEN COUNT(1) > 0 AND ${dag.offset}<= 9
THEN true
ELSE false
END
FROM xc_dpe_e2.xc_rpt_user_info_d where dt='20200101';
end节点示例代码中将表行数和迁移量与固定值比较,来限制do-while节点整体的循环次数。
使用Shell语言
if [ ${dag.loopTimes} -lt 5 ];
then
echo "True"
else
echo "False"
fi
将循环次数${dag.loopTimes}
和5进行比较,来限制do-while节点整体的循环次数。
例如:第一次循环${dag.loopTimes}
的值为1、第二次为2,以此类推,第五次为5。至此end节点的输出结果为false,do-while节点退出循环。
使用Python(Python2)语言
if ${dag.loopTimes}<${dag.input.length}:
print True;
else
print False;
# 如果end节点输出True,则继续下一个循环。
# 如果end节点输出False,则终止循环。
代码中把循环次数${dag.loopTimes}
和赋值节点传递的数据集行数进行比较,来限制do-while节点整体的循环次数。
应用场景
与赋值节点联合使用
注意事项 | 配置案例 | 配置案例 |
---|---|---|
使用do-while节点 进行循环任务时,内部节点的循环任务在每一次循环时,需要获取使用上游节点(up节点 )的输出参数时,此时可以使用赋值节点(assign_node )。 |
| ![]() |
与分支节点、归并节点联合应用
与分支节点和归并节点联合应用时,典型的应用场景和注意事项如下所示。
应用场景 | 注意事项 |
---|---|
do-while节点内部需要进行逻辑判断或者结果遍历时,此时可以在do-while节点的内部节点中自定义循环任务节点,并使用分支节点(branch_node 和归并节点(merge_node ))。 | 在do-while节点内部,分支节点(branch_node )需要和归并节点(merge_node )同时使用。 |