注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
インクリメンタル計算は、出力データセットを生成するための変換を効率的に行う方法です。変換のビルド履歴を利用することで、インクリメンタル計算は変換が実行されるたびに全ての出力データセットを再計算する必要性を回避します。
インクリメンタルパイプラインの作成と管理についてのエンドツーエンドのガイダンスについては、パイプラインの構築セクションを参照してください。
このセクションでは、まずインクリメンタル変換を使用しないコード例を考慮することで、インクリメンタル変換の利点を検討します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12
from transforms.api import transform, Input, Output @transform( students=Input('/examples/students_hair_eye_color'), processed=Output('/examples/hair_eye_color_processed') ) def filter_hair_color(students, processed): # type: (TransformInput, TransformOutput) -> None students_df = students.dataframe() # これは効率が悪いです。なぜなら、フィルター機能が入力全体ではなく新しいデータのみに対して実行されるからです processed.write_dataframe(students_df.filter(students_df.hair == 'Brown'))
/examples/students_hair_eye_color
入力データセットに新たなデータが追加されると、filter()
は入力全体に対して実行され、新たに追加されたデータだけではありません。これは、計算リソースと時間の両方を無駄にします。
トランスフォームがそのビルド履歴を認識できるようになると、その出力をどのように計算するかについてよりスマートになることができます。具体的には、入力に対する変更を使用して出力データセットを変更することができます。テーブルを再マテリアライズする際に既にマテリアライズされたデータを使用するこのプロセスは、インクリメンタル計算 と呼ばれます。インクリメンタル計算がなければ、出力データセットは常にトランスフォームの最新の出力で置き換えられます。
上で示した例のトランスフォームに戻ってみましょう。トランスフォームは students
データセットに対して filter()
を実行し、茶髪の学生を書き出します。インクリメンタル計算を使用すると、students
に2人の新しい学生のデータが追加された場合、トランスフォームはそのビルド履歴に関する情報を使用して、新たに茶髪の学生だけを出力に追加することができます:
+---+-----+-----+------+ +---+-----+-----+------+
| id| hair| eye| sex| | id| hair| eye| sex|
+---+-----+-----+------+ ビルド 1 +---+-----+-----+------+
| 17|Black|Green|Female| ---------> | 18|Brown|Green|Female|
| 18|Brown|Green|Female| +---+-----+-----+------+
| 19| Red|Black|Female|
+---+-----+-----+------+
... ...
+---+-----+-----+------+ ビルド 2 +---+-----+-----+------+
| 20|Brown|Amber|Female| ---------> | 20|Brown|Amber|Female|
| 21|Black|Blue |Male | +---+-----+-----+------+
+---+-----+-----+------+
したがって、上記の例のトランスフォームは、次の構文を使用してインクリメンタルなロジックで書き換えることができます:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from transforms.api import transform, incremental, Input, Output @incremental() @transform( students=Input('/examples/students_hair_eye_color'), processed=Output('/examples/hair_eye_color_processed') ) def filter_hair_color(students, processed): # type: (IncrementalTransformInput, IncrementalTransformOutput) -> None # 英語: Read the added data from the input # 日本語: 入力から追加されたデータを読み込む students_df = students.dataframe('added') # 英語: Filter the data for students with brown hair and write the result to the output # 日本語: 茶色の髪の生徒をフィルタし、結果を出力に書き込む processed.write_dataframe(students_df.filter(students_df.hair == 'Brown'))
インクリメンタル変換と @incremental
デコレータの詳細については、インクリメンタル変換リファレンス を参照してください。
データセットのうち1つが完全に読み込まれるリファレンステーブルで、もう1つがインクリメンタルに読み込まれるインクリメンタルデータセットの場合、結合を計算するのは安全です。ただし、結合に参加する両方のデータセットをインクリメンタルに読み込むには、特別な処理が必要です。例として、大量のデータセットを結合するためにインクリメンタル変換を活用する を参照してください。