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

您可通过以下内容了解遍历节点(for-each节点)的使用: 了解遍历节点(for-each节点)内部可根据业务需要自定义遍历节点内部业务流程,但要求待遍历业务流程开始节点需要为自带的start节点,业务流程结束节点需要为节点自带的end节点。 节点组成与流程编排 了解遍历节点(for-each节点)遍历次数由赋值节点的输出决定。 了解遍历节点(for-each节点)提供的内置变量可获取每次遍历的相关值。 提供遍历节点(for-each节点)变量取值与遍历次数案例说明 上游赋值节点为Shell时取值示例、上游赋值节点为ODPS SQL时取值示例
  • 仅DataWorks标准版及以上版本支持使用for-each节点。详情请参见 DataWorks各版本详解
  • for-each节点循环次数上限为128次。实际遍历次数由赋值节点输出的结果集决定。
  • 不支持并发执行。即上次循环完成后才可进入下一次循环。
  • DataWorks为标准模式时,不支持在DataStudio界面直接测试运行for-each节点。

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

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

    节点组成与流程编排

    DataWorks的for-each节点是包含内部节点的一种特殊节点,您在创建完成for-each节点时,同时也自动创建完成了三个内部节点: start节点 (循环开始节点)、 sql节点 (循环任务节点)、 end节点 (循环结束判断节点),通过内部节点组织成内部节点流程,实现对上游赋值节点输出结果的循环遍历。 for-each内部节点 如上图所示:
  • sql节点
    DataWorks默认为您创建好了一个SQL类型的内部任务运行节点,您也可以删除默认的 sql节点 后,自定义内部循环遍历任务的运行节点。
  • 您的循环遍历任务是SQL类型的任务,则可以直接双击默认的 sql节点 ,进入节点的代码开发页面开发任务代码。
  • 您的循环遍历任务比较复杂,您可以在内部节点流程中新建其他任务节点,并根据实际情况重新构建节点的运行流程。
    说明 自定义循环任务节点时,您可以删除内部节点间的依赖关系,重新编排循环节点内部业务流程,但需要分别将 start节点 end节点 分别作为for-each节点内部业务流程的首末节点。
  • shell、python遍历次数:按一维数组类型的输出,循环遍历次数即为一维数组元素的个数(按逗号切分)。

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

  • SQL类型遍历次数:按二维数组类型的输出,循环遍历次数即为二维数组元素的行数。
    例如,赋值节点的赋值语言为OdpsSQL时,输出结果为二维数组:
    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
    +----------------------------------------------+
    则for-each节点会循环2次完成遍历。

    内置变量

    您可通过以下方式在遍历节点内部各节点获取遍历节点外部赋值节点的相关结果集。若遍历节点内部业务流程中存在赋值节点,您可以通过赋值节点下游默认取值方式在遍历节点内部进行取值。赋值节点下游取值方式请参见: 赋值节点
    DataWorks的for-each节点每次循环遍历赋值节点的输出结果时,您可以通过一些内置的变量来获取当前已循环次数和偏移量。
  • 赋值节点输出
    上游赋值节点为ODPS SQL节点,最后一条select语句查询出两条数据:
    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
    +----------------------------------------------+
  • 遍历节点取值
    说明 由于输出结果为二维数组,数组行数为2,因此for-each总遍历次数为2。 ${dag.loopDataArray}
    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
    +----------------------------------------------+
    ${dag.foreach.current} 0016359810821,湖北省,30~40岁,巨蟹座 0016359814159,未知,30~40岁,巨蟹座 ${dag.offset} ${dag.loopTimes} ${dag.foreach.current[0]} 0016359810821 0016359814159 ${dag.loopDataArray[1][0]} 0016359814159
  •