在 Azure Databricks 作业中有条件地运行任务
默认情况下,作业任务会在其依赖项已运行且全部成功时运行,但你也可以将 Azure Databricks 作业中的任务配置为仅在满足特定条件时才会运行。 Azure Databricks 作业支持以下方法来有条件地运行任务:
- 可以指定 Run if 依赖项,以基于任务依赖项的运行状态运行任务。 例如,可以使用
Run if
运行任务(即使其部分或所有依赖项失败),从而允许作业从故障中恢复并继续运行。 - If/else 条件 任务用于基于布尔表达式的结果运行作业 DAG 的一部分。
If/else condition
任务允许向作业添加分支逻辑。 例如,仅当上游引入任务添加新数据时运行转换任务。 否则运行数据处理任务。
添加任务的 Run if
条件
编辑具有一个或多个依赖项的任务时,可以配置Run if
条件。 要将条件添加到任务,请从任务配置的“Run if dependencies”下拉菜单中选择条件。 完成所有任务依赖项后,将会对 Run if
条件进行评估。 还可以在添加具有一个或多个依赖项的新任务时添加Run if
条件。
Run if
条件选项
可以将以下Run if
条件添加到任务:
- 全部成功:所有依赖项都已运行并成功。 这是运行任务的默认条件。 如果未满足条件,任务会标记为
Upstream failed
。 - 至少一个成功:至少有一个依赖项成功。 如果未满足条件,任务会标记为
Upstream failed
。 - 无失败:没有依赖项失败,并且至少运行了一个依赖项。 如果未满足条件,任务会标记为
Upstream failed
。 - 全部完成:任务在运行所有依赖项后运行,而不考虑依赖运行的状态。 此条件允许定义运行的任务,而不取决于其依赖任务的结果。
- 至少一个失败:至少有一个依赖项失败。 如果未满足条件,任务会标记为
Excluded
。 - 全部失败:所有依赖项都失败。 如果未满足条件,任务会标记为
Excluded
。
注意
- 如果配置为处理故障的任务不满足
Run if
条件,则会标记为Excluded
。 排除的任务会跳过,并被视为成功。 - 如果排除所有任务依赖项,也会排除该任务,不考虑其
Run if
条件。 - 如果取消任务运行,取消会传播到下游任务,并将运行具有处理故障的
Run if
条件的任务,例如在取消任务运行后验证清理任务运行。
Azure Databricks 作业如何确定作业运行状态?
Azure Databricks 作业可根据作业的叶任务结果确定作业运行是否成功。 叶任务是无下游依赖项的任务。 作业运行可以有以下三个结果之一:
- 成功:所有任务都成功。
- 成功但失败:一些任务失败,但所有叶任务都成功。
- 失败:一个或多个叶任务失败。
使用 If/else condition
任务向作业添加分支逻辑
使用 If/else condition
任务基于布尔表达式运行作业 DAG 的一部分。 表达式由布尔运算符和一对操作数组成,其中操作数可以使用作业和任务参数变量,或使用任务值来引用作业或任务状态。
注意
- 数字和非数字值的处理方式不同,具体取决于布尔运算符:
==
和!=
运算符可对其操作数执行字符串比较。 例如,12.0 == 12
计算为 false。>
、>=
和<=
运算符可对其操作数执行数值比较。 例如,12.0 >= 12
计算结果为 true,10.0 >= 12
则计算为 false。- 在引用操作数中的任务值时,仅允许使用数值、字符串和布尔值。 任何其他类型将会导致条件表达式失败。 非数值类型将会序列化为字符串,并被视为
If/else condition
表达式中的字符串。 例如,如果任务值设置为布尔值,则会将其序列化为"true"
或"false"
。
在创建作业或在现有作业中编辑任务时,可以添加 If/else condition
任务。 要配置 If/else condition
任务,请:
- 在“类型”下拉菜单中,选择“
If/else condition
”。 - 在第一个“条件”文本框中,输入要计算的操作数。 操作数可以引用作业、任务参数变量或任务值。
- 从下拉菜单中选择布尔运算符。
- 在第二个“条件”文本框中,输入用于计算条件的值。
要在 If/else condition
任务上配置依赖项,请:
- 在 DAG 视图中选择
If/else condition
任务,然后单击“+ 添加任务”。 - 输入任务的详细信息后,单击“依赖于”,然后选择“
<task-name> (true)
”,其中<task-name>
是If/else condition
任务的名称。 - 对计算为
false
的条件重复上述操作。
例如,假设你有一个名为 process_records
的任务,该任务在名为 bad_records
的值中维护无效记录的计数,并且你希望根据是否找到无效记录来进行分支处理。 要将此逻辑添加到工作流,可以使用表达式(例如 {{tasks.process_records.values.bad_records}} > 0
)创建 If/else condition
任务。 然后,可以根据条件的结果添加依赖任务。
在包含 If/else condition
任务的作业运行完成后,可以在 UI 中查看作业运行详细信息时,查看表达式的结果和表达式计算的详细信息。