分支节点

更新时间:
复制 MD 格式

分支节点用于根据上游节点的输出结果,决定下游哪些节点需要运行、哪些节点跳过执行。典型场景如:根据数据量大小选择不同的处理策略,或根据业务状态码执行不同的后续流程。

节点介绍

分支节点根据上游节点的输出参数,使用Python比较运算符进行条件判断,将结果分配到不同的分支。每个分支可以关联不同的下游节点,满足条件的分支对应的下游节点会正常运行,不满足条件的分支对应的下游节点会被跳过(空跑)。

典型场景

假设您有一个每日数据同步任务,需要根据源表的数据量选择不同的下游处理策略:

  • 步骤1:上游的数据探查节点(赋值节点)查询源表行数,并将结果赋值给输出参数 row_count。

  • 步骤2:分支节点接收 row_count 参数,定义两个分支条件:

    • 分支1:${row_count} > 10000(数据量大于1万行)

    • 分支2:${row_count} <= 10000(数据量不超过1万行)

  • 步骤3:分支1的下游挂载分批同步节点(大数据量时分批处理),分支2的下游挂载全量同步节点(数据量较小时一次性同步)。运行时只有满足条件的分支对应的下游节点会执行。

整体流程如下:

数据探查(输出row_count) → 分支节点(判断row_count) → 满足条件的下游节点运行

下文将以该场景为例,介绍如何创建和配置分支节点。

空跑机制:分支节点中,若某个分支在运行时不满足分支条件,则该分支的下游节点任务将被置为空跑状态,日志会打印It's set condition-skip by task相关信息。由于空跑属性会向下传递,不建议将自依赖的任务放置在分支链路上。是否沿用空跑属性,详情请参见是否沿用上游的空跑属性。

前提条件

  • 您需购买DataWorks标准版及以上版本,才可以使用分支节点。DataWorks版本介绍及购买,详情请参见DataWorks各版本功能详情。

  • 分支节点通常需要配合赋值节点使用:上游赋值节点将判断所需的参数(如数据行数、状态码等)传递给分支节点,分支节点再根据该参数值进行条件判断。

注意事项

  • 分支数量上限:分支节点最多可挂载50个分支。

  • 空字符串判定陷阱:分支条件不支持使用空字符串('')进行判定。例如,当分支条件为 '${tp_code}' != '' 时,若参数取值为空格,空格会被判定为"有值"(空格不等于空字符串),该分支仍会被选中。建议使用特殊占位符代替空值。例如,将参数默认值设置为 tp_code='NONE',并将分支条件配置为 '${tp_code}' != 'NONE'。

  • 多分支匹配:当多个分支条件同时满足时,所有满足条件的分支对应的下游节点都会被执行。请确保分支条件之间互斥,或明确多分支同时满足时的业务逻辑。

操作步骤

  1. 进入数据开发页面。

    登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与运维 > 数据开发,在下拉框中选择对应工作空间后单击进入数据开发。

  2. 鼠标悬停至新建图标,单击新建节点 > 通用 > 分支节点。

    您也可以打开相应的业务流程,右键单击新建节点 > 通用 > 分支节点。

  3. 在新建节点对话框,输入节点名称,并选择路径。

  4. 单击确认。

  5. 定义分支逻辑。

    1. 在分支逻辑定义页面,单击添加分支。

    2. 在配置分支定义对话框中,配置各项参数。

      参数

      描述

      分支条件

      分支条件的说明如下:

      • 分支条件仅支持按照Python比较运算符定义逻辑判断条件。

      • 如果运行态表达式取值为true,表示满足对应的分支条件。

      • 如果运行态表达式解析报错,会将整个分支节点运行状态置为失败。

      • 分支条件中支持使用全局变量和节点上下文定义的参数。例如,${input}可以是定义在分支节点的节点输入参数。

      关联到节点输出

      关联到节点输出的说明如下:

      • 节点输出供分支节点下游节点挂载依赖关系使用。

      • 满足分支条件时,对应的关联的节点输出上挂载的下游节点被选中运行(同时需要参考该节点依赖的其它上游节点的状态)。

      • 不满足分支条件时,对应的关联的节点输出上挂载的下游节点不会被选中执行,该下游节点会被置成因为分支条件不满足而未运行的状态。

      分支描述

      对分支的定义进行简要说明。例如,定义${input}==1和${input}>2两个分支。

      关联到节点输出配置示例(以上文的典型场景为例):

      分支节点的下游关联两个节点:分批同步和全量同步。配置时,将分支1(条件:${row_count} > 10000)关联到节点输出 data_sync.branch_large,将分支2(条件:${row_count} <= 10000)关联到节点输出 data_sync.branch_small。下游分批同步节点挂载 data_sync.branch_large 作为上游依赖,全量同步节点挂载 data_sync.branch_small 作为上游依赖。运行时,只有满足条件的分支对应的下游节点会被执行。

    3. 单击确定。

      添加分支后,您可以进行编辑和删除操作:

      • 单击编辑,可以修改设置的分支,并且相关的依赖关系也会发生变化。

      • 单击删除,可以删除设置的分支,并且相关的依赖关系也会发生变化。

  6. 单击节点编辑区域右侧的调度配置,配置节点的调度属性。

    定义好分支条件后,会在调度配置 > 调度依赖区域的本节点输出名称中,自动添加输出名称。下游节点可以通过输出名称进行依赖挂载。

    说明

    如果连线建立上下文的依赖,在调度配置中没有输出记录,请手动输入。

  7. 提交并发布节点任务。

    1. 单击工具栏中的保存图标,保存节点。

    2. 单击工具栏中的提交图标,提交节点任务。

    3. 在提交对话框中,输入变更描述。

    4. 单击确认。

    如果您使用的是标准模式的工作空间,任务提交成功后,需要将任务发布至生产环境进行发布。请单击顶部菜单栏左侧的任务发布。具体操作请参见发布任务。

  8. 查看周期调度任务。

    1. 单击编辑界面右上角的运维,进入生产环境运维中心。

    2. 查看运行的周期调度任务,详情请参见管理周期任务。

    如果您需要查看更多周期调度任务详情,可单击顶部菜单栏的运维中心,详情请参见运维中心概述。

完整示例:根据数据量选择同步策略

以下示例演示如何搭建一个完整的分支节点工作流:上游数据探查节点统计源表行数 → 分支节点根据行数选择同步策略 → 下游执行对应的同步任务。

步骤1:准备上游赋值节点

创建一个数据探查赋值节点,查询源表的行数并将结果赋值给输出参数 row_count。赋值节点的输出名称为 data_sync.probe_output,输出值为行数(例如 15000)。

步骤2:配置分支节点

创建分支节点,将上游数据探查节点的输出 data_sync.probe_output 设置为分支节点的输入参数 row_count。然后定义两个分支:

  • 分支1:条件为 ${row_count} > 10000,关联到节点输出 data_sync.branch_large,说明为"大数据量分批同步"。

  • 分支2:条件为 ${row_count} <= 10000,关联到节点输出 data_sync.branch_small,说明为"小数据量全量同步"。

步骤3:配置下游节点

创建两个下游节点,分别挂载分支节点的不同输出:

  • 分批同步节点:在调度依赖配置面板中,将上游节点的父节点输出名称设置为 data_sync.branch_large。该节点仅在数据量超过1万行时运行。

  • 全量同步节点:将上游节点的父节点输出名称设置为 data_sync.branch_small。该节点仅在数据量不超过1万行时运行。

步骤4:查看运行结果

提交并发布任务后,在运维中心查看运行结果。假设本次源表行数为15000行(满足分支1条件):

  • 满足条件的分支:分支1(15000 > 10000 为 true)→ 分批同步节点正常运行。您可以在运行日志中查看该节点的执行日志和运行结果。

  • 不满足条件的分支:分支2(15000 <= 10000 为 false)→ 全量同步节点被跳过。其运行日志中显示黄色提示信息:It's set condition-skip by task,表示该节点被分支条件跳过,运行持续时间为0s。

通过该流程,您可以根据上游数据的实际状态,自动选择最合适的下游处理策略,避免不必要的全量处理或分批处理。

附录:支持的Python比较运算符

以下假设变量a为10,变量b为20。

运算符

描述

示例

==

等于:比较对象是否相等。

(a==b)返回false。

!=

不等于:比较两个对象是否不相等。

(a!=b)返回true。

<>

不等于:比较两个对象是否不相等。

(a<>b)返回true。这个运算符类似!=。

>

大于:返回x是否大于y。

(a>b)返回false。

<

小于:返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。

(a<b)返回true。

>=

大于等于:返回x是否大于等于y。

(a>=b)返回false。

<=

小于等于:返回x是否小于等于y。

(a<=b)返回true。