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

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

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

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

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

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

Run if 条件オプション

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

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

  • 少なくとも 1 つが成功しました: 少なくとも 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タスクを使用して、ブール式に基づいてジョブ DAG の一部を実行します。 この式は、ブール演算子と 1 組のオペランドで構成されます。オペランドは、ジョブとタスクの変数を使用してジョブまたはタスクの状態を参照するか、タスクの値を使用します。

注:

  • 数値と非数値は、ブール演算子に応じて異なる方法で処理されます。

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

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

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

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

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

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

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

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

If/else conditionタスクの依存関係を構成するには:

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

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

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

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

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