分岐ノードは、DataStudio の論理制御ノードの一種です。このトピックでは、分岐ノードを使用して特定の時点でタスクを実行する方法について説明します。
分岐ノードをサポートするための背景情報
cron式を使用して、毎月の最終日に実行するようにノードをスケジュールすることはできません。分岐ノードがサポートされた後、分岐ノードを作成し、switch-caseモデルを使用して、毎月の最終日に実行するようにノードをスケジュールできます。詳細については、「分岐ノードを構成する」をご参照ください。
分岐ノードと他の制御ノード
[datastudio] ページで、現在のエディションのDataWorksでサポートされている制御ノード(代入ノード、分岐ノード、マージノードなど)を表示できます。
各制御ノードの機能:
[代入ノード]:代入ノードの出力をその子孫ノードに渡すことができます。詳細については、「代入ノードを構成する」をご参照ください。
代入ノードは、依存関係を構成するために ノードコンテキスト 機能を再利用します。定数と変数に加えて、代入ノードはノードコンテキストでのカスタム出力をサポートします。DataWorksは、代入ノードのクエリ結果を取得または表示し、その結果を子孫ノードが参照するためのノードコンテキストの outputs パラメーターの値として使用します。
[分岐ノード]:分岐ノードは、どの後続ノードが期待どおりに実行できるかを決定します。詳細については、「分岐ノードを構成する」をご参照ください。
分岐ノードは、依存関係で入力と出力を構成するためのDataWorksの機能を再利用します。詳細については、「同一サイクルのスケジューリング依存関係を構成する」をご参照ください。
共通ノードの場合、出力はグローバルに一意の文字列のみです。共通ノードの子孫ノードとしてノードを構成するには、共通ノードのグローバルに一意の文字列を子孫ノードの入力として指定できます。
ただし、分岐ノードの場合、分岐ノードの子孫ノードを構成するときに、条件に関連付けられた出力を分岐ノードの出力として選択できます。ノードが分岐ノードの子孫ノードになると、ノードも条件に関連付けられます。
条件が満たされると、条件に関連付けられた出力に依存する子孫ノードは期待どおりに実行できます。
条件に関連付けられた出力に依存しない他の後続ノードはドライランです。
[マージノード]:マージノードは、その祖先ノードが実行されるかどうかに関係なく、実行されるようにスケジュールされます。
分岐ノードによって選択されていない分岐では、DataWorksはその分岐上のすべてのノードのインスタンスをドライランインスタンスとして設定します。インスタンスは、その祖先インスタンスの1つがドライランインスタンスである場合、ドライランになります。
DataWorksでは、マージノード を使用して、ドライランプロパティが無制限にダウンストリームに渡されるのを防ぐことができます。マージノードは、いくつの祖先ノードがドライランであっても成功として設定され、マージノードの子孫ノードはドライランされません。
次の図は、分岐ノードを含む依存関係ツリーの論理関係を示しています。
ASN:代入ノード。複雑なシナリオでの計算に使用され、分岐ノードの条件を選択できます。
XとY:分岐ノード。代入ノード ASN の子孫ノードであり、代入ノードの出力に基づいて分岐を選択します。ノード X は左の分岐を選択し、ノード Y は左の2つの分岐を選択します(次の図の緑色の線でマークされています)。
ノード A と C は、ノード X と Y によって選択されているため、期待どおりに実行できます。
ノード B はノード Y によって選択されています。ただし、ノード B はノード X によって選択されていないため、ドライランです。
ノード E はノード Y によって選択されていません。したがって、ノード E は、共通ノード Z を祖先ノードとして持っている場合でも、ドライランです。
ノード G も、ノード C と F が実行されていても、その祖先ノード E がドライランであるため、ドライランです。
ドライランプロパティはいつダウンストリームに渡されないのでしょうか?
JOINノードはマージノードです。その特別な機能は、ドライランプロパティが渡されるのを防ぐことです。ノード D は JOIN ノードの子孫ノードです。したがって、ノード D はノード B からドライランプロパティを継承せず、実行できます。
分岐ノードを他の制御ノードと一緒に使用して、毎月の最終日にのみノードを実行するようにスケジュールできます。
分岐ノードを使用する
ノードの依存関係を定義します。
ルートノード(代入ノード)は、スケジューリング時間を指定する SKYNET_CYCTIME パラメーターに基づいて、現在の日が月の最終日かどうかを判断します。現在の日が最終日の場合、1 が返されます。そうでない場合は、0 が返されます。出力は DataWorks によってキャプチャされ、子孫ノードに渡されます。
分岐ノードは、代入ノードの出力に基づいて分岐を定義します。
2 つの Shell ノードは、分岐ノードの子孫ノードとして構成され、異なる分岐ロジックを実行します。
代入ノードを定義します。
作成された代入ノードには、組み込みの outputs パラメーターがあります。代入ノードは、SQL、SHELL、または Python 言語で記述できます。
SQL 言語で記述された代入ノードの場合、DataWorks は最後の SELECT ステートメントを outputs パラメーターの値としてキャプチャします。
SHELL または Python 言語で記述された代入ノードの場合、DataWorks は最後の行の標準出力を outputs パラメーターの値としてキャプチャします。
このトピックでは、代入ノードのコードは Python で記述されています。次の図は、代入ノードのスケジューリングプロパティとコードを示しています。
コード
スケジューリングプロパティの構成
分岐を定義します。
Python式を使用して、分岐ノードの条件を定義できます。各条件は出力に関連付けられています。条件が満たされると、条件に関連付けられた出力に依存する子孫ノードが実行され、他の子孫ノードはドライランになります。
スケジューリングプロパティの構成
分岐の構成
条件に関連付けられ、スケジューリング構成で生成される出力
タスク実行ノードを異なる分岐に関連付けます。
分岐ノードには3つの出力があります。1つの出力を入力として選択できます。出力は条件に関連付けられているため、出力の選択には注意が必要です。
毎月の最終日に実行されるノードの依存関係
毎月の最終日以外に実行されるノードの依存関係
結果を確認します。
上記の手順を実行した後、ノードをコミットしてデプロイできます。ノードをデプロイした後、ノードのデータをバックフィルして、構成の効果をテストできます。データのタイムスタンプを 2018 年 12 月 30 日と 2018 年 12 月 31 日に設定します。これは、スケジューリング時間が 2018 年 12 月 31 日と 2019 年 1 月 1 日であることを意味します。最初のバッチのデータバックフィルインスタンスは、最終日のロジックをトリガーします。2番目のバッチのデータバックフィルインスタンスは、最終日以外の日のロジックをトリガーします。2つのロジックには次の違いがあります。
データのタイムスタンプは 2018 年 12 月 30 日で、スケジューリング時間が 2018 年 12 月 31 日であることを示します。
分岐ノードの分岐選択結果
最終日に実行されるノードは期待どおりに実行されます。
最終日以外に実行されるノードはドライランです。
データのタイムスタンプは 2018 年 12 月 31 日で、スケジューリング時間が 2019 年 1 月 1 日であることを示します。
分岐ノードの分岐選択結果
最終日に実行されるノードはドライランです。
最終日以外に実行されるノードは期待どおりに実行されます。
まとめ
分岐ノードを使用する場合は、次の点に注意してください。
DataWorks は、代入ノードの最後の SELECT ステートメントまたは標準出力ストリームの最後の行を、代入ノードの出力としてキャプチャします。出力は子孫ノードによって参照されます。
分岐ノードの各出力は条件に関連付けられています。ノードを分岐ノードの子孫ノードとして構成する場合は、出力を選択する前に、各出力に関連付けられている条件を理解する必要があります。
分岐が選択されていない場合、分岐上の後続ノードはドライランになります。ドライランプロパティは、マージノードが見つかるまで常にダウンストリームに渡されます。