do-while节点最佳实践

本文为您介绍通过循环的方式依次处理一组数据的每一行的复杂场景。

前提条件

请在操作前,先了解do-while节点逻辑,详情请参见do-while节点逻辑原理介绍

背景信息

循环节点循环输出赋值节点结果集。

  • 需要部署一个上游节点,能够把查询出的数据输出给下游节点使用,您可以使用赋值节点实现该条件。

  • 循环节点需要能够获取上游赋值节点的输出,您可以通过配置上下文依赖来实现该条件。

  • 循环节点的内部节点需要能够引用到每一行的数据,增强已有的节点上下文,并额外下发了系统变量${dag.offset},可以帮您快速引用循环节点的上下文。

以下以一个具体的案例,为您示例复杂场景的配置步骤。 复杂案例如上图所示:

  • 赋值节点输出一个二维数组,将此二维数组传递给do-while循环节点。

    二维数组的示例值为:

    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40岁   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40岁   | 巨蟹座 |
    +----------------------------------------------+
  • do-while节点的内部节点通过变量来获取并打印当前循环参数、偏移量、上游赋值节点输入的参数值等。

配置流程

循环节点

  1. 配置节点依赖

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

  2. 赋值结果集

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

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

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

创建并配置赋值节点

核心操作要点为:

  • 赋值代码与上下文参数:选择赋值节点的赋值语言,并通过命令定义好赋值节点最终输出的结果集,赋值节点会将本节点最后一条输出语句赋值给赋值节点自带的outputs输出参数。

    说明

    赋值节点的输出后续需要作为do-while节点本节点输入。以下代码仅为测试使用,您无法直接访问图上代码中使用的表,您可在了解循环节点基本使用后,将代码中的表替换为您空间下已有的表。

    赋值节点

  • 上下游依赖关系:您可以在业务流程中新建一个赋值节点,并通过连线,配置赋值节点为do-while节点的上游节点。

详细操作步骤请参见赋值节点

do-while节点获取结果集

单击do-while节点编辑页面右侧的调度配置,在do-while节点的节点上下文区域,单击添加。设置参数名input取值来源为上游赋值节点的输出。

说明

这里的上下文关系为赋值节点与do-while节点的上下文参数配置,不是内部节点的上下文参数配置。

调度配置

定义循环体

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

do-while节点默认有startshellend三个节点,通过编译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]};

定义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;

运行节点并查看结果

进入运维中心后,右键节点选择补数据 > 当前节点及下游节点,选择赋值节点和循环节点,运行完成后在运行日志中查看运行结果。

说明
  • 如果您在do-while节点内使用了赋值节点传递的值,请在运维中心测试时,同时运行赋值节点和循环节点。

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

  • 赋值节点的输出结果。赋值节点结果

  • 第1次end节点的运行结果。第一次end

  • 第2次end节点的运行结果。第二次end