Databricks ジョブで条件付きでタスクを実行する

既定では、ジョブ タスクは、その依存関係が実行され、すべてが成功したときに実行されますが、特定の条件が満たされた場合にのみ実行するように Databricks ジョブのタスクを構成することもできます。 Databricks ジョブでは、タスクを条件付きで実行するための次のメソッドがサポートされています。

  • [ 依存関係の場合は実行 ] を指定して、タスクの依存関係の実行ステータスに基づいてタスクを実行できます。 たとえば、 Run if を使用して、依存関係の一部またはすべてに障害が発生した場合でもタスクを実行し、ジョブを障害から回復して実行を続行できます。

  • If/else 条件タスクは、Boolean式の結果に基づいてジョブ DAG の一部を実行するために使用されます。If/else conditionタスクを使用すると、ジョブに分岐ロジックを追加できます。たとえば、アップストリーム インジェスト タスクが新しいデータを追加する場合にのみ、変換タスクを実行します。 それ以外の場合は、データ処理タスクを実行します。

タスクのRun if条件を追加する

Run if条件は、1 つ以上の依存関係を持つタスクを編集するときに構成できます。タスクに条件を追加するには、タスク設定の [ 依存関係の場合は実行 ] ドロップダウン メニューから条件を選択します。 Run if条件は、すべてのタスクの依存関係が完了した後に評価されます。また、1 つ以上の依存関係を持つ新しいタスクを追加するときに、 Run if 条件を追加することもできます。

Run if 条件オプション

次の Run if 条件をタスクに追加できます。

  • すべて成功: すべての依存関係が実行され、成功しました。 これは、タスクを実行するための既定の条件です。 条件が満たされていない場合、タスクは Upstream failed としてマークされます。

  • 少なくとも 1 つの依存関係が成功しました。 条件が満たされていない場合、タスクは Upstream failed としてマークされます。

  • 失敗なし: どの依存関係も失敗せず、少なくとも 1 つの依存関係が実行されました。 条件が満たされていない場合、タスクは Upstream failed としてマークされます。

  • すべて完了: タスクは、依存する実行のステータスに関係なく、すべての依存関係が実行された後に実行されます。 この条件により、依存するタスクの結果に依存せずに実行されるタスクを定義できます。

  • 少なくとも 1 つの依存関係が失敗しました: 少なくとも 1 つの依存関係が失敗しました。 条件が満たされていない場合、タスクは Excluded としてマークされます。

  • すべて失敗: すべての依存関係が失敗しました。 条件が満たされていない場合、タスクは Excluded としてマークされます。

  • 障害を処理するように構成されたタスクは、Run if条件が満たされていない場合にExcludedとしてマークされます。除外されたタスクはスキップされ、成功として扱われます。

  • すべてのタスクの依存関係が除外されると、 Run if 条件に関係なく、タスクも除外されます。

  • タスク実行を取り消すと、取り消しはダウンストリーム タスクに伝達され、失敗を処理する Run if 条件を持つタスクが実行されます (たとえば、タスク実行が取り消されたときにクリーンアップ タスクの実行を確認するため)。

Databricks ジョブはジョブの実行状態をどのように判断しますか?

Databricks ジョブは、ジョブの リーフ タスクの結果に基づいて、ジョブの実行が成功したかどうかを判断します。 リーフ タスクは、ダウンストリームの依存関係がないタスクです。 ジョブ実行は、次の 3 つの結果のいずれかになります。

  • 成功: すべてのタスクが成功しました。

  • 失敗して成功: 一部のタスクは失敗しましたが、すべてのリーフ タスクは成功しました。

  • 失敗: 1 つ以上のリーフ タスクが失敗しました。

If/else condition タスクを使用してジョブに分岐ロジックを追加する

If/else condition タスクを使用して、 Boolean 式に基づいてジョブ DAG の一部を実行します。 この式は、 Boolean 演算子とオペランドのペアで構成され、オペランドは 、ジョブおよびタスク・パラメーター変数 を使用してジョブまたはタスクの状態を参照したり、 タスク値を使用したりできます。

  • 数値と非数値は、 Boolean 演算子によって異なる方法で処理されます。

    • == 演算子と != 演算子は、オペランドの文字列比較を実行します。たとえば、 12.0 == 12 は false と評価されます。

    • >>=、および <= 演算子は、オペランドの数値比較を実行します。たとえば、 12.0 >= 12 は true と評価され、 10.0 >= 12 は false と評価されます。

    • 数値、文字列、および Boolean 値のみ、オペランドで タスク値 を参照する場合に使用できます。 その他の型では、条件式が失敗します。 数値以外の値型は文字列にシリアル化され、 If/else condition 式では文字列として扱われます。 たとえば、タスク値が Boolean 値に設定されている場合、"true"または"false"にシリアル化されます。

If/else conditionタスクは、ジョブを作成するとき、または既存のジョブのタスクを編集するときに追加できます。If/else conditionタスクを構成するには:

  1. [タイプ] ドロップダウン メニューで、[If/else conditionを選択します。

  2. 最初の [条件 ] テキスト ボックスに、評価するオペランドを入力します。 オペランドは、ジョブまたはタスクのパラメーター変数、またはタスク値を参照できます。

  3. ドロップダウンメニューから Boolean 演算子を選択します。

  4. 2 番目の [条件 ] テキスト ボックスに、条件を評価するための値を入力します。

If/else conditionタスクの依存関係を構成するには、次のようにします。

  1. DAG ビューで If/else condition タスクを選択し、[ + タスクの追加] をクリックします。

  2. タスクの詳細を入力したら、「 依存先 」をクリックし、「 <task-name> (true) 」を選択します。 <task-name>If/else condition タスクの名前です)。

  3. falseと評価される条件について繰り返します。

たとえば、 process_records という名前のタスクがあり、 bad_recordsという名前の値で無効なレコードの数を保持し、無効なレコードが見つかったかどうかに基づいて処理を分岐するとします。 このロジックをワークフローに追加するには、 {{tasks.process_records.values.bad_records}} > 0のような式を使用してIf/else conditionタスクを作成します。その後、条件の結果に基づいて依存タスクを追加できます。

If/else conditionタスクを含むジョブの実行が完了した後、UI でジョブ実行の詳細を表示すると、式の結果と式の評価の詳細を表示できます。