DataWorks为您提供遍历节点(for-each节点),您可以通过for-each节点来循环遍历赋值节点传递的结果集。同时您也可以重新编排for-each节点内部的业务流程。本文以一个具体示例,通过for-each节点2次循环遍历赋值节点输出结果,并在每次循环遍历时打印当前循环次数,为您介绍fo-each节点的逻辑原理与操作流程。

前提条件

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

背景信息

DataWorks的for-each节点主要用于有循环遍历的场景,且需要与赋值节点联合使用,将赋值节点作为for-each节点的上游节点,将赋值节点的输出结果赋值给for-each节点后,一次次循环来遍历赋值节点的输出结果。此外,for-each节点也是拥有内部节点: start节点(循环开始节点)、 sql节点end节点for-each内部节点您也可以自定义for-each遍历节点的内部业务流程,并通过for-each遍历节点提供的内置变量获取赋值节点传递的结果集。原理逻辑的详情请参见 逻辑原理介绍

使用限制与注意事项

  • 上下游依赖

    for-each遍历节点需要遍历赋值节点传递的值,所以赋值节点需作为for-each节点的上游节点,for-each节点需要依赖赋值节点。

  • 循环支持
    • 仅DataWorks标准版及以上版本支持使用for-each节点。
    • for-each节点最多支持循环128次,如果超过了128次,则运行会报错。实际循环遍历次数由上游赋值节点实际输出控制。
      • 一维数组类型的输出,循环遍历次数即为一维数组元素的个数。

        例如,赋值节点的赋值语言为SEHLL或Python(Python2)时,输出结果为一维数组:2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,则for-each节点会循环5次完成遍历。

      • 二维数组类型的输出,循环遍历次数即为二维数组元素的行数。
        例如,赋值节点的赋值语言为OdpsSQL时,输出结果为二维数组:
        +----------------------------------------------+
        | uid            | region | age_range | zodiac |
        +----------------------------------------------+
        | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
        | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
        +----------------------------------------------+
        则for-each节点会循环2次完成遍历。
  • 内部节点
    • 您可以删除for-each节点的内部节点间的依赖关系,重新编排内部业务流程,但需要分别将start节点end节点分别作为for-each节点内部业务流程的首末节点。
    • 在for-each节点的内部节点使用分支节点进行逻辑判断或者结果遍历时,需要同时使用归并节点。
  • 调测运行
    • DataWorks为标准模式时,不支持在DataStudio界面直接测试运行for-each节点。

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

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

操作流程

使用遍历节点时,通常与赋值节点一起使用,操作流程如下所示。

遍历节点
  1. 设置节点依赖关系

    for-each遍历节点需要依赖赋值节点。配置详情可参考文档:创建和配置业务流程

  2. 赋值结果集

    赋值节点自带的节点上下文输出参数outputs,需作为for-each遍历节点的节点上下文输入参数。配置详情可参考文档:配置赋值节点

  3. 遍历节点的内部节点参数获取参数

    根据业务需求自定义for-each遍历节点的内部业务流程,并在内部流程的节点中通过内置变量来获取所需参数值,运行循环遍历任务。内置变量的详情请参见内置变量,配置详情请参见配置for-each节点

创建和配置业务流程

您需要创建一个上游为赋值节点,下游为for-each节点的业务流程:

  1. 进入数据开发页面。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击工作空间列表
    3. 选择工作空间所在地域后,单击相应工作空间后的进入数据开发
  2. 创建业务流程。
    1. 鼠标悬停至新建图标,单击业务流程
    2. 新建业务流程对话框中,输入业务名称描述
      注意 业务名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
    3. 单击新建
  3. 创建for-each节点。
    1. 鼠标悬停至新建图标,单击通用 > for-each
      您也可以找到相应的业务流程,右键单击 通用,选择 新建 > for-each
    2. 新建节点对话框中,输入节点名称,并选择目标文件夹
      注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
    3. 单击提交
  4. 创建赋值节点,赋值节点的详情请参见配置赋值节点
    1. 在业务流程的编辑页面,鼠标单击通用 > 赋值节点并拖拽至右侧的编辑页面。
      赋值
    2. 新建节点对话框中,输入节点名称,并选择目标文件夹(默认在当前业务流程目录下)。
      注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
    3. 单击提交
  5. 通过拖拽连线,设置赋值节点为for-each节点的上游节点。
    依赖

配置赋值节点

  1. 双击赋值节点名称,打开节点的编辑页面。
  2. 请选择赋值语言列表中,选中SHELL
  3. 在节点的编辑页面,输入以下语句。
    echo 'this is name,ok';
  4. 单击节点编辑页面右侧的调度配置,在节点上下文 > 本节点输出参数区域查看默认输出的outputs参数。
    outputs
  5. 单击工具栏中的保存图标,保存赋值节点。
  6. 提交赋值节点。
    注意 您需要设置节点的 重跑属性依赖的上游节点,才可以提交节点。
    1. 单击工具栏中的提交图标。
    2. 提交新版本对话框中,输入备注
    3. 单击确认
    如果您使用的是标准模式的工作空间,提交成功后,请单击右上角的 发布。具体操作请参见 发布任务

配置for-each节点

  1. 双击打开for-each节点的编辑页面,默认有startSQLend三个节点。
    SQL
  2. 删除SQL节点。
    您可以根据自身需求,选择第2个节点为不同的类型:
    • 如果您需要使用ODPS SQL节点,请跳过此步骤。
    • 如果您需要使用其它类型的节点(本文以使用Shell节点为例),请先删除默认产生的SQL节点。
    1. 右键单击处于for-each节点中间的SQL节点,单击删除节点
      删除节点
    2. 删除对话框中,单击确定
  3. 创建并编辑Shell节点。
    您可以通过同样的方式,新建不同类型的节点。如果您使用的是默认的 SQL节点,请跳过此步骤。
    1. 鼠标单击通用 > Shell并拖拽至右侧的编辑页面。
      Shell
    2. 新建节点对话框中,输入节点名称
      注意 节点名称必须是大小写字母、中文、数字、下划线(_)以及小数点(.),且不能超过128个字符。
    3. 单击提交
    4. 在for-each节点的编辑页面,通过拖拽连线,设置Shell节点的上游为start节点,下游为end节点。
    5. 双击Shell节点,进入Shell节点的编辑页面。
    6. 输入以下代码。
      echo ${dag.loopTimes} ----打印循环的次数。
      说明
      • for-each节点的start节点和end节点的逻辑是固定的,不可以进行编辑。
      • Shell节点中的代码修改后请务必保存,提交时不会进行提示。如果未保存,最新的代码不能及时更新。
      for-each节点支持以下四种环境变量:
      • ${dag.foreach.current}:当前遍历到的数据行。
      • ${dag.loopDataArray}:输入的数据集。
      • ${dag.offset}:偏移量。
      • ${dag.loopTimes}:当前循环次数,值为${dag.offset}+1
      变量详情请参见 内置变量内置变量取值案例
  4. 配置for-each节点。
    1. 在for-each节点的编辑页面,单击右侧的调度配置
    2. 节点上下文 > 本节点输入参数区域,单击默认参数名loopDataArray后的编辑
    3. 取值来源列表中,选择上游赋值节点的outputs参数。
      outputs
      说明 您在调度配置中添加上游赋值节点的依赖关系后,请手动添加取值来源。如果未添加取值来源,提交节点时会报错。
    4. 单击保存
  5. 单击工具栏中的保存图标,保存for-each节点。
  6. 提交for-each节点。
    注意 您需要设置节点的 重跑属性依赖的上游节点,才可以提交节点。
    1. 单击工具栏中的提交图标。
    2. 提交对话框中,选中需要提交的节点,输入备注
      提交
    3. 单击提交
    如果您使用的是标准模式的工作空间,提交成功后,请单击右上方的 发布。具体操作请参见 发布任务
  7. 测试节点,并查看结果。
    1. 单击页面右上方的运维,进入运维中心
    2. 在左侧导航栏,单击周期任务运维 > 周期任务
    3. 选中相应的节点,在右侧的DAG图中,右键单击赋值节点,选中补数据 > 当前节点及下游节点
      补数据
    4. 刷新补数据实例页面,待补数据实例运行成功后,单击实例后的DAG图
    5. 右键单击赋值节点,选中查看运行日志,确认赋值结果。
      赋值节点结果
    6. 补数据实例页面,右键单击遍历节点,选中查看内部节点
      内部节点
    7. 在内部节点页面,单击左侧的第1次,并右键单击Shell节点,选中查看运行日志
      运行日志
      在运行日志页面,查看第1次循环时,Shell节点的日志。 1
    8. 以同样的方式,查看第2次循环时,Shell节点的日志。
      2