注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Pythonトランスフォームは、出力データセットが変更されない場合(新しいデータがデータセットに書き込まれない場合)にジョブが正常に完了するように、トランザクションを中止するためのサポートを提供します。これは、transform
デコレータを使用し、TransformOutput
オブジェクトで .abort()
を呼び出すことで達成されます。
トランザクションの中止は、特定の条件下で出力データセットと下流のデータセットの更新を防ぐ必要がある場合に使用できます。出力データセットが更新されると、下流のデータセットは古くなった(stale)とみなされ、次回ビルドされる際に更新されます(手動またはスケジュールによるビルド)。これはビルドの失敗を避けるための代替手段を提供します。これにより、何かが実際に失敗しているときにそれを識別するのが容易になります。
中止されたトランザクションは、データセットのトランザクション履歴でグレー表示され、成功したジョブとして表示されます。これにより、成功したビルドがコミットされたトランザクションであったかどうかを一目で区別できます。
トランザクションを中止したい場合の例:
常に更新するが、常に出力が変更されるわけではないデータセットの後に、abort()
を使ったバリデーションデータセットを追加すると、下流での不必要な更新を避けることで計算リソースを節約できます。
以下は、入力データセットに今日のデータが到着した場合にのみデータセットを更新したいと思うかもしれない、単純な概念的な例です。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from transforms.api import transform, Input, Output from datetime import date # 休日の旅行データを処理する関数を定義 @transform( holiday_trips=Input('/examples/trips'), # 休日の旅行データを入力として受け取る processed=Output('/examples/trips_processed') # 処理されたデータを出力として送信する ) def update_daily_trips(holiday_trips, processed): holiday_trips_df = holiday_trips.dataframe() # 休日の旅行データをデータフレームに変換 todays_trips_df = holiday_trips_df.filter(holiday_trips_df.trip_date == date.today()) # 今日の旅行データをフィルタリング if (todays_trips_df.count() == 0): # 今日の旅行データがない場合 processed.abort() # 処理を中止する else: # 今日の旅行データがある場合 processed.write_dataframe(todays_trips_df) # 処理されたデータを出力する
if (len(todays_trips_df.head(1)) == 0)
を使用すると、通常は if (todays_trips_df.count() == 0)
よりも早く結果が返されます。これは、すべての行を不必要に数えるのではなく、少なくとも1行が存在するかどうかだけを確認するためです。
ジョブが「無視」されたとマークされると、ジョブスペックが古くないとFoundryが判断したため計算は実行されません。トランザクションが中止されると、ジョブは実行されて成功しますが、出力データセットは変更されず、トランザクションはコミットされません。
インクリメンタルトランスフォームは、入力と出力の両方のデータセットビューをコミットされたトランザクションのみを使用して読み取ります。これは、インクリメンタル計算を行う際に中止されたトランザクションは無視されることを意味します。
トランザクションがインクリメンタルトランスフォームのすべての出力で明示的に中止されると、次のビルドは、中止されたトランザクションが発生しなかったかのように入力を読み取り(したがって再処理します)、したがってインクリメンタルに実行することができます。トランザクションが出力の一部のみで中止された場合、ビルドはインクリメンタルに実行できません。中止されたトランザクションがある出力では、出力ジョブスペックは中止されたトランザクションが無視されるため、以前の入力トランザクション範囲を使用します。コミットされたトランザクションがある出力では、出力ジョブスペックは現在の入力トランザクション範囲を使用します。この入力トランザクション範囲の不一致により、トランスフォームはもはやインクリメンタルに実行できません。
マルチ出力のインクリメンタルトランスフォームで、トランザクションが出力の一部で明示的に中止された場合、次のビルドはスナップショットとして実行されるか、require_incremental=True
の場合は InconsistentProvenanceRecords
のエラーで失敗します。これは、現在の出力のビューが異なる入力トランザクションによって生成されたことを意味します。