注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Pythonトランスフォームは、出力データセットが変更されない場合(新しいデータがデータセットに書き込まれない場合)にジョブを正常に完了させるためのトランザクションの中止をサポートしています。これは、トランスフォーム
デコレータを使用し、TransformOutput
オブジェクト上で .abort()
を呼び出すことにより実現されます。
トランザクションの中止は、特定の条件下で出力データセットと下流のデータセットの更新を防ぐ必要がある場合に使用できます。出力データセットが更新されるとすぐに、下流のデータセットは古いものとみなされ(stale)、次にビルドされるとき(手動またはスケジュールされたビルドによる)に更新されます。ビルドの失敗に対する代替手段を提供します。これにより、何が実際に失敗しているかを特定しやすくなります。
中止されたトランザクションは、データセットのトランザクション履歴でグレー表示され、成功したジョブとして表示されます。これにより、成功したビルドがコミットされたトランザクションを結果としたかどうかを一目で区別できます。
トランザクションを中止する場合の例:
常に更新するが常に出力が変更されるわけではないデータセットの後に、abort()
を使用するバリデーションデータセットを追加すると、不必要な下流の更新を回避し、計算リソースを節約します。
以下に、入力データセットに今日のデータが到着した場合にのみデータセットを更新したいと考える可能性がある、単純な仮想例を示します。
if (len(todays_trips_df.head(1)) == 0)
を使用すると、if (todays_trips_df.count() == 0)
を使用するよりも通常、結果が早く返されます。これは、全ての行を無駄に数えるのではなく、少なくとも1つの行が存在するかどうかだけを確認するためです。
ジョブが「無視」されると、ジョブスペックが古くないとFoundryが判断したため、計算は実行されません。トランザクションが中止されると、ジョブは実行され、成功裏に完了しますが、出力データセットは変更されず、トランザクションはコミットされません。
増分トランスフォームは、入力と出力の両方のデータセットビューをコミットされたトランザクションだけを使用して読み取ります。これは、増分計算を行うときに中止されたトランザクションを無視することを意味します。
増分トランスフォームのすべての出力でトランザクションが明示的に中止されると、次のビルドは中止されたトランザクションが一度も発生していないかのように入力を読み取り(したがって再処理)、増分的に実行できるようになります。トランザクションが出力の一部だけで中止されると、ビルドは増分的に実行できなくなります。中止されたトランザクションがある出力の場合、出力ジョブスペックは中止されたトランザクションが無視されるため、以前の入力トランザクション範囲を使用します。コミットされたトランザクションがある出力の場合、出力ジョブスペックは現在の入力トランザクション範囲を使用します。この入力トランザクション範囲の不一致により、トランスフォームは増分的に実行できなくなります。
マルチ出力の増分トランスフォームでは、出力の一部でトランザクションが明示的に中止されると、次のビルドはスナップショットとして実行され、失敗した増分計算チェックProvenance records for the previous build are inconsistent
が発生します。require_incremental=True
が設定されている場合、ビルドはエラーInconsistentProvenanceRecords
で失敗します。これは、出力の現在のビューが異なる入力トランザクションによって生成されたためです。