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

前提条件

您需要购买DataWorks标准版及以上版本,才可以使用do-while节点。

背景信息

DataWorks的do-while(循环)节点是包含内部节点的一种特殊节点,您在创建完成do-while节点时,同时也自动创建完成了三个内部节点:start节点(循环开始节点)、sql节点(循环任务节点)、end节点(循环结束判断节点),通过内部节点组织成内部节点流程,实现任务的循环运行。循环节点您也可以自定义循环任务节点,并通过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节点的执行日志时,您需要右键实例,单击查看内部节点来查看内部节点的执行日志。

配置流程

循环节点
  1. 配置节点依赖

    do-while节点需要依赖赋值节点。

  2. 赋值结果集

    赋值节点自带的节点上下文输出参数outputs,需作为do-while循环节点的节点上下文输入参数。

  3. do-while循环节点的内部节点获取参数

    根据业务需求自定义do-while循环节点的内部业务流程,并在内部流程的节点中通过变量来获取所需参数值。

创建do-while节点

  1. 进入数据开发页面。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击工作空间列表
    3. 选择工作空间所在地域后,单击相应工作空间后的进入数据开发
  2. 数据开发页面,鼠标悬停至新建图标,单击通用 > do-while
    您也可以打开相应的业务流程,右键单击通用,选择新建 > do-while
  3. 新建节点对话框中,输入节点名称,并选择目标文件夹
    说明 节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。
  4. 单击提交

do-while节点的简单示例

本节为您介绍如何使用循环节点循环5次,并在每次循环中打印出当前的循环次数的端到端操作步骤。简单示例
  1. 双击do-while节点名称,进入内部节点页面。
    do-while节点默认有startsqlend三个节点:
    • start节点是一个循环开始的标记节点,并无业务作用。
    • sql节点是DataWorks提供的一个业务处理节点示例,此处需要将其删除,替换为自己的业务处理Shell节点(打印当前循环次数)。
    • end节点具有标记循环结束和判断是否开启下一次循环的功能,此处用于定义do-while节点的结束条件。
  2. 删除sql节点。
    1. 右键单击处于do-while节点中间的sql节点,单击删除节点
      删除节点
    2. 删除对话框中,单击确定
  3. 创建并编辑循环任务节点,本示例使用Shell节点。
    1. 鼠标单击通用 > Shell并拖拽至右侧的编辑页面。
      Shell
    2. 新建节点对话框中,输入节点名称
      注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
    3. 单击提交
    4. 在do-while节点的编辑页面,通过拖拽连线,设置Shell节点的上游为start节点,下游为end节点。
    5. 双击Shell节点,进入Shell节点的编辑页面。
    6. 输入以下代码。
      echo ${dag.loopTimes} ----打印循环的次数。
      • ${dag.loopTimes}变量是系统的保留变量,代表当前的循环次数,从1开始,do-while的内部节点可以直接引用该变量。更多内置变量请参见内置变量变量取值案例
      • Shell节点中的代码修改后请务必保存,提交时不会进行提示。如果未保存,最新的代码不能及时更新。
      打印循环次数
  4. 配置end节点,控制循环次数。
    1. 双击打开end节点的编辑页面。
    2. 请选择赋值语言下拉列表中,选中Python
    3. 输入以下代码,定义do-while节点的结束条件。
      if ${dag.loopTimes}<5: 
       print True; 
      else: 
       print False;
      • ${dag.loopTimes}变量是系统的保留变量,代表当前的循环次数,从1开始,do-while的内部节点可以直接引用该变量。更多内置变量请参见内置变量变量取值案例
      • 代码中把dag.loopTimes和5进行比较,可以限制整体的循环次数。第一次循环dag.loopTimes为1、第二次为2,以此类推,第五次为5。至此表达式${dag.loopTimes}<5结果为false,退出循环。
  5. 单击节点编辑页面右侧的调度配置,配置节点的调度属性,详情请参见配置基础属性
  6. 单击工具栏中的保存图标。
  7. 提交do-while节点。
    注意 您需要设置节点的重跑属性依赖的上游节点,才可以提交节点。
    1. 单击工具栏中的提交图标。
    2. 提交对话框中,选中需要提交的节点,输入备注
    3. 单击提交
    如果您使用的是标准模式的工作空间,提交成功后,请单击右上方的发布。具体操作请参见发布任务
  8. 测试节点,并查看结果。
    说明 DataWorks为标准模式时,不支持在DataStudio界面直接测试运行do-while节点。

    如果您想测试验证do-while节点的运行结果,您需要将包含do-while节点的任务发布提交到运维中心,在运维中心页面运行do-while节点任务。如果您在do-while节点内使用了赋值节点传递的值,请在运维中心测试时,同时运行赋值节点和循环节点。

    1. 单击页面右上方的运维,进入运维中心
    2. 在左侧导航栏,单击周期任务运维 > 周期任务
    3. 选中相应的节点,在右侧的DAG图中,右键单击赋值节点,选中补数据 > 当前节点及下游节点
    4. 刷新补数据实例页面,待补数据实例运行成功后,单击实例后的DAG图
    5. 右键单击do-while节点,选中查看内部节点
      内部循环体
      do-while节点的内部循环体分以下三部分:
      • 视图左侧为do-while节点的重跑历史列表,只要do-while实例整体运行一次,历史列表便会产生一条相应的记录。
      • 视图中部为循环记录列表,会列出当前do-while节点共运行多少次循环,以及每次循环的状态。
      • 视图右侧为每次循环的具体信息,单击循环记录列表中的某次循环,即可展示出该循环每个实例的运行情况。
    6. 在内部节点页面,单击左侧的第3次,并右键单击Shell节点,选中查看运行日志
      在运行日志页面,查看第3次循环end节点的日志。执行日志
      查看第5次循环end节点的日志。执行日志

      第5次循环运行结束,退出循环。

    由该示例可见,do-while节点的工作流程如下:
    1. 从start节点开始运行。
    2. 按照定义的任务依赖关系依次运行每个任务。
    3. 在end节点中定义循环的结束条件。
    4. 一组任务运行完毕之后,运行end的结束条件语句。
    5. 如果end的判断语句在日志中打印True,则从1开始继续下一个循环。
    6. 如果end的判断语句在日志中打印False,则退出整个循环,do-while节点整体结束。

循环节点的复杂示例

除上述简单场景外,您还会遇到通过循环的方式依次处理一组数据的每一行的复杂场景。实现该场景前,您需要满足以下条件:
  • 需要部署一个上游节点,能够把查询出的数据输出给下游节点使用,您可以使用赋值节点实现该条件。
  • 循环节点需要能够获取上游赋值节点的输出,您可以通过配置上下文依赖来实现该条件。
  • 循环节点的内部节点需要能够引用到每一行的数据,增强已有的节点上下文,并额外下发了系统变量${dag.offset},可以帮您快速引用循环节点的上下文。
以下以一个具体的案例,为您示例复杂场景的配置步骤。复杂案例如上图所示:
  • 赋值节点输出一个二维数组,将此二维数组传递给do-while循环节点。
    二维数组的示例值为:
    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
    +----------------------------------------------+
  • do-while节点的内部节点通过变量来获取并打印当前循环参数、偏移量、上游赋值节点输入的参数值等。
  1. 创建并配置赋值节点。
    核心操作要点为:
    • 赋值代码与上下文参数:选择赋值节点的赋值语言,并编译赋值参数的代码,后续赋值节点的本节点输出会根据规则生成输出参数。
      说明 赋值节点的输出后续需要作为do-while节点本节点输入。
      赋值节点
    • 上下游依赖关系:您可以在业务流程中新建一个赋值节点,并通过连线,配置赋值节点为do-while节点的上游节点。
    详细操作步骤请参见配置赋值节点
  2. 将赋值节点的输出添加为do-while节点的本节点输入。
    单击do-while节点编辑页面右侧的调度配置,在do-while节点的节点上下文区域,单击添加。设置参数名input取值来源为上游赋值节点的输出。
    说明 这里的上下文关系为赋值节点与do-while节点的上下文参数配置,不是内部节点的上下文参数配置。
    调度配置
  3. 配置do-whiel节点的内部循环任务节点。

    双击do-while节点名称,打开节点的编辑页面,定义循环体。

    do-while节点默认有startsqlend三个节点,您需要删除sql节点并创建一个Shell节点,通过编译Shell节点的代码,打印循环参数。操作核心要点如下。
    • 上下游依赖:删除sql新建Shell后,需要通过连线将内部节点的上下游关系建立好。复杂案例-内部
    • 循环任务代码:内部的Shell节点的代码编译时,可以联合内置变量来打印各种循环参数。do-while节点可用的内置变量可参见内置变量,Shell节点的参考代码如下。
      echo '${dag.input}';
      echo '获取当前循环的行数据:'${dag.input[${dag.offset}]};
      
      echo '获取偏移量:'${dag.offset};
      
      echo '获取循环次数:'${dag.loopTimes};
      
      echo '获取上游赋值节点_odpssql传递的数据集长度:'${dag.input.length};
      
      echo '如果您要取赋值节点传递的数据集中某行某列数据,需要按照二维数组方式取值:'${dag.input[0][1]};
  4. 定义end节点的循环结束条件。
    可使用do-while节点支持的内置变量来进行循环控制。例如,比较变量dag.loopTimes(循环次数)和dag.input.length(取值长度)。如果dag.loopTimes小于dag.input.length,输出True并继续循环。如果不小于,则输出False并退出循环。样例代码如下。
    if ${dag.loopTimes}<${dag.input.length}:
        print True;
    else:
        print False;
  5. 运行节点并查看结果。
    进入运维中心后,右键节点选择补数据 > 当前节点及下游节点,选择赋值节点和循环节点,运行完成后在运行日志中查看运行结果。
    说明
    • 如果您在do-while节点内使用了赋值节点传递的值,请在运维中心测试时,同时运行赋值节点和循环节点。
    • 在运维中心查看do-while节点的执行日志时,您需要右键实例,单击查看内部节点来查看内部节点的执行日志。
    • 赋值节点的输出结果。赋值节点结果
    • 第1次end节点的运行结果。第一次end
    • 第2次end节点的运行结果。第二次end

总结

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