for-each节点

更新时间:2025-02-05 05:27:02

DataWorks为您提供遍历节点(for-each节点),您可以通过for-each节点来循环遍历赋值节点传递的结果集。同时您也可以重新编排for-each节点内部的业务流程。本文为您介绍for-each节点的组成与应用逻辑。

节点介绍

DataWorksfor-each节点主要用于有循环遍历的场景,且需要与赋值节点联合使用,将赋值节点作为for-each节点的上游节点,将赋值节点的输出结果赋值给for-each节点后,一次次循环来遍历赋值节点的输出结果。

前提条件

  • RAM账号添加至对应空间(可选)。

    进行任务开发的RAM账号已被添加至对应工作空间中,并具有开发空间管理员(权限较大,谨慎添加)角色权限。添加成员并授权,详情请参见为工作空间添加空间成员

  • 对应空间已绑定Serverless资源组。详情请参见:使用Serverless资源组

  • 进行for-each节点开发前,需创建对应的for-each节点,详情请参见:创建任务节点

使用限制

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

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

注意事项

维度

分类

说明

维度

分类

说明

上下游依赖

依赖设置

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

遍历支持

遍历次数上限

for-each节点需要与赋值节点联合使用,首先在调度配置面板里,为loopDataArray参数绑定上下文参数,随后在循环体内编排节点逻辑,最大循环次数为128次,实际遍历次数由赋值节点输出的结果集决定。

遍历次数

由赋值节点输出的结果集决定。

内部节点

流程编排

  • 您可以删除for-each节点的内部节点间的依赖关系,重新编排内部业务流程,但需要将Start节点End节点分别作为for-each节点内部业务流程的首末节点。

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

取值

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

调试运行

任务调试

  • DataWorks在标准模式下,不支持在Data Studio界面直接测试运行for-each节点。

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

  • 请同时执行赋值节点与for-each节点。在运维中心针对周期任务执行补数据操作时,请选择从赋值节点开始补数据,同时执行赋值节点与for-each遍历节点,勿单独执行for-each节点。

查看日志

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

内置变量

您可通过以下方式在遍历节点内部各节点获取遍历节点外部赋值节点的相关结果集。若遍历节点内部业务流程中存在赋值节点,您可以通过赋值节点下游默认取值方式在遍历节点内部进行取值。赋值节点下游取值方式请参见赋值节点

  • DataWorksfor-each节点每次循环遍历赋值节点的输出结果时,您可以通过一些内置的变量来获取当前已循环次数和偏移量。

    内置变量

    含义

    for循环对比

    内置变量

    含义

    for循环对比

    ${dag.loopDataArray}

    获取赋值节点的数据集。

    相当于for循环中的代码结果:

    data=[]

    ${dag.foreach.current}

    获取当前遍历值。

    以下面的for循环代码为例:

    for(int i=0;i<data.length;i++) {
       print(data[i]);
    }
    • data[i]相当于${dag.foreach.current}

    • i相当于${dag.offset}

    ${dag.offset}

    当前偏移量(每一次遍历相对于第一次的偏移量)。

    ${dag.loopTimes}

    获取当前遍历次数。

    -

  • 了解输出表的结构情况下,可使用如下变量方式,获取其它变量取值。

    其他变量

    含义

    其他变量

    含义

    ${dag.foreach.current[n]}

    上游赋值节点的输出结果为二维数组时,每次遍历时获取当前数据行的某列的数据。

    ${dag.loopDataArray[i][j]}

    上游赋值节点的输出结果为二维数组时,获取数据集中具体第i行第j列的数据。

    ${dag.foreach.current[n]}

    上游赋值节点的输出结果为一维数组时,获取具体某列数据。

步骤一:for-each节点开发

for-each节点开发说明

DataWorksfor-each节点是包含内部节点的一种特殊节点,您在创建完成for-each节点时,双击进入for-each节点中,可配置for-each节点的循环体,通过循环体的内创建节点,组织成内部节点流程,实现对上游赋值节点输出结果的循环遍历。

  • 设置节点依赖关系

    for-each遍历节点需要依赖赋值节点,创建赋值节点可参见:赋值节点

  • 赋值结果集

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

  • 便利节的内部节点获取参数。

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

说明

遍历节点不支持在Data Studio 中测试。

配置赋值节点

  1. 打开赋值节点后,需从右下角将语言模式切换为Shell。

  2. 在页面编辑页面,编写以下测试语句:

    echo 'this is name,ok';
  3. 配置完成后,可参考调度配置对赋值节点的调度进行配置,参考开发赋值节点查看赋值节点的outputs输出参数。

  4. 完成调度配置后,单击工具栏中的image按钮,保存赋值节点即可。

配置for-each节点

进入for-each节点,默认包含image开始、image结束,以及for-each循环体三部分,配置for-each节点,主要是对循环体的配置。

  1. 单击循环体的新建内部节点,在下拉框里选择Shell节点,并对Shell节点进行命名。

  2. 编辑Shell节点。

    1. 数遍单击循环体内创建的Shell节点,右键选择打开节点,进入Shell节点编辑页面。

    2. Shell节点开发:

      echo ${dag.loopTimes} ----打印循环的次数。
      说明
      • or-each节点的image开始和image结束的逻辑是固定的,不可以编辑。

      • Shell节点中的代码修改后请务必保存,提交时不会进行提示。如果未保存,最新的代码将无法及时更新。

      for-each节点支持以下四种环境变量:

      • ${dag.foreach.current}:当前遍历到的数据行。

      • ${dag.loopDataArray}:输入的数据集。

      • ${dag.offset}:偏移量。

      • ${dag.loopTimes}:当前循环次数,值为${dag.offset}+1

  3. 配置循环体内的Shell节点。

    1. 在循环体内的Shell节点的编辑页面,单击右侧的调度配置

    2. 在调度参数模块单击右侧添加参数。

    3. 在新增的参数的参数值右侧单击image将上游赋值节点的outputs绑定为参数。

      说明

      您在调度配置中添加上游赋值节点的依赖关系后,请手动添加取值来源。如果未添加取值来源,提交节点时会报错。

  4. 单击工具栏的image图标,保存循环体内的Shell节点。

  5. 配置完成后,返回至工作流中,单击发布,对赋值节点与for-each,详情请参见:节点发布

    说明

    需要设置节点的重跑属性依赖的上游节点,才可以提交节点。

测试并查看测试结果

  1. 发布完成的任务,将按照您配置的任务调度进行周期运行,可在运维中心 > 任务运维 > 周期任务运维 > 周期任务中查看已发布的周期任务,并对任务进行运维操作。

  2. 在周期任务页面,对for-each节点上游的赋值节点进行补数据 > 当前节点及下游节点,详情请参见执行补数据并查看补数据实例(新版)

  • 本页导读 (1)
  • 节点介绍
  • 前提条件
  • 使用限制
  • 注意事项
  • 内置变量
  • 步骤一:for-each节点开发
  • for-each节点开发说明
  • 配置赋值节点
  • 配置for-each节点
  • 测试并查看测试结果