do-while节点逻辑原理介绍

DataWorks为您提供循环节点(do-while节点),您可根据业务需要重新编排循环节点内部业务流程,将需要循环执行的业务逻辑放入循环节点内部,并通过循环节点内部的End节点来定义循环条件,即确认不满足何种条件的情况下退出循环。循环节点可单独使用,也可结合赋值节点来循环遍历赋值节点传递的结果集。本文为您介绍do-while节点的组成与应用逻辑。

背景信息

您可通过以下内容了解循环节点(do-while节点)的使用:

说明

相关文档

了解循环节点(do-while节点)的使用限制与注意事项。例如,循环次数上限、如何测试与如何查看日志。

使用限制注意事项

了解循环节点(do-while节点)内部可根据业务需要自定义循环节点内部业务流程,但要求待循环业务流程开始节点需要为自带的Start节点,业务流程结束节点需要为节点自带的End节点。

节点组成与流程编排

了解循环节点(do-while节点)提供内置变量可获取每次循环的相关参数,并提供取值案例加强理解。

内置变量取值案例

了解循环节点通过End节点控制是否退出循环,并提供退出循环的End节点代码示例。

退出循环示例:End节点代码样例

推荐循环节点(do-while节点)典型应用场景。

应用场景1:与赋值节点联合使用、应用场景2:与分支节点、归并节点联合应用

使用限制

  • 仅DataWorks标准版及以上版本支持使用do-while节点。详情请参见DataWorks各版本详解

  • do-while节点循环次数上限为1024次。

  • 不支持并发执行。即上次循环完成后才可进入下一次循环。

注意事项

维度

分类

说明

循环支持

循环次数上限

do-while节点最多支持循环1024次,End节点控制循环次数时,如果超过了1024次,则运行会报错。

内部节点

流程编排

  • 自定义循环任务节点时,您可以删除内部节点间的依赖关系,重新编排循环节点内部业务流程,但需要分别将Start节点End节点作为do-while节点内部业务流程的首末节点。

  • 在do-while节点的内部节点使用分支节点进行逻辑判断或者结果遍历时,需要同时使用归并节点

  • do-while节点的内部节点End节点在代码开发时,不支持添加注释。

取值

提供内置变量来取上游赋值节点的指定的值。

调试运行

任务调试

DataWorks为标准模式时,不支持在DataStudio界面直接测试运行do-while节点。

如果您想测试验证do-while节点的运行结果,您需要将包含do-while节点的任务发布提交到开发环境运维中心,在开发环境运维中心页面运行do-while节点任务。

查看日志

在运维中心查看do-while节点的执行日志时,您需要右键实例,单击查看内部节点来查看内部节点的执行日志。

上下游依赖

依赖设置

循环节点可单独使用,也可结合赋值节点使用,在运维中心执行任务时,选择补数据功能,并同时选中执行赋值节点与循环节点,单独运行循环节点将无法获取到赋值节点传递的值。

节点组成与流程编排

DataWorks的do-while节点是包含内部节点的一种特殊节点,您在创建完成do-while节点时,同时也自动创建完成了三个内部节点:Start节点(循环开始节点)、Shell节点(循环任务节点)、End节点(循环结束判断节点),通过内部节点组织成内部节点流程,实现任务的循环运行。循环节点如上图所示:

  • Start节点

    代表循环开始,不承载具体的任务代码,循环节点内部具体待循环执行的任务节点均需要直接或间接依赖该Start节点,且不支持删除。

  • 循环逻辑

    DataWorks默认为您创建一个Shell类型的内部任务运行节点,您也可以删除默认的Shell节点,根据实际情况重新构建循环节点内部待循环的业务流程。

    通常循环任务的业务流程会与赋值节点、分支节点、归并节点联合使用,自定义循环任务节点时,可删除内部节点间的依赖关系,重新编排循环节点内部业务流程,但需要分别将Start节点End节点作为do-while节点内部业务流程的首末节点。

  • End节点

    • End节点是do-while节点的循环判断节点,来控制do-while节点循环次数,其本质上是一个赋值节点,输出truefalse两种字符串,分别代表继续下一个循环和不再继续循环。

    • End节点支持使用ODPS SQL、Shell和Python(Python2)三种语言进行循环判断代码开发,同时do-while节点为您提供了便利的内置变量,便于您进行End代码开发。内置变量的介绍请参见内置变量取值案例,不同语言开发的样例代码请参见退出循环示例:End节点代码样例

    • 循环节点内部具体待循环执行的任务节点均需要直接或间接为该End的节点上游,且不支持删除该节点。

内置变量

通常,do-while节点使用${dag.变量名}格式来获取变量。DataWorks为您提供了两个系统内置变量${dag.loopTimes}${dag.offset};同时,您也可以结合赋值节点,通过${dag.变量名}格式获取赋值参数值。

  • 系统内置变量

    每次任务循环运行时,您可以通过一些内置的变量来获取当前已循环次数和偏移量。

    内置变量

    含义

    取值

    ${dag.loopTimes}

    当前已循环次数

    第一次循环为1、第二次为2、第三次为3…第n次为n。

    ${dag.offset}

    偏移量

    第一次循环为0、第二次为1、第三次为2…第n次为n-1。

  • 获取赋值节点结果

    如果您联合使用了赋值节点,则还可以通过以下方式来获取赋值参数值和循环变量参数。

    说明

    当do-while节点依赖赋值节点时,您可将赋值节点的本节点输出参数设置为do-while节点的本节点输入参数,在do-while节点中获取赋值节点的结果集与结果集中的指定节点。格式为${dag.变量名},其中,变量名需配置为do-while节点的本节点输入参数。本文示例定义do-while节点中的input参数(即本节点输入参数)来接收赋值节点结果集,实际使用时,需替换为您真实的参数名称。

    内置变量

    含义

    ${dag.input}

    上游赋值节点传递的数据集。

    ${dag.input[${dag.offset}]}

    循环节点内部获取当前循环的数据行。

    ${dag.input.length}

    循环节点内部获取数据集长度。

取值案例

不同赋值语言的赋值节点,其结果集格式存在差异。do-while节点获取赋值节点结果集时,Shell赋值语言需使用一维数组的方式在代码中获取赋值节点传递的结果集、或结果集中的指定数据;ODPS SQL赋值语言需使用二维数组的方式在代码中获取赋值节点传递的结果集、或结果集中的指定数据。详情请参见赋值节点输出格式

案例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]}

    说明

    二维数组的第一行第二列的取值。

    湖北省

    ${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节点与赋值节点联合使用时,典型的应用场景和注意事项如下所示:

注意事项

配置案例

配置案例

使用do-while节点进行循环任务时,内部节点的循环任务在每一次循环时,需要获取使用上游节点(up节点)的输出参数时,此时可以使用赋值节点(assign_node)。

  • 依赖关系

    do-while节点需要依赖上游赋值节点(assign_node)。

    说明

    如上图所示,依赖关系是do-while节点依赖赋值节点,而非do-while的内部循环任务节点(shell节点)依赖赋值节点。

  • 上下文参数

    • 赋值节点需将输出参数作为赋值节点(assign_node)的本节点输出参数

    • do-while的内部循环任务节点(shell节点)需将赋值节点的输出参数添加为本节点输入参数

      说明

      上下文关系设置,需设置内部的循环任务节点,而非do-while节点。

赋值节点配置案例

与分支节点、归并节点联合应用

分支节点归并节点联合应用时,典型的应用场景和注意事项如下所示。典型应用

应用场景

注意事项

do-while节点内部需要进行逻辑判断或者结果遍历时,此时可以在do-while节点的内部节点中自定义循环任务节点,并使用分支节点(branch_node)和归并节点(merge_node)。

在do-while节点内部,分支节点(branch_node)需要和归并节点(merge_node)同时使用。