DataWorks には do-while ノードが用意されており、ワークフローの一部を繰り返し実行できます。ノード内でループのビジネスロジックを定義し、終了ノードで終了条件を制御できます。また、do-while ノードを代入ノードと組み合わせて、代入ノードから渡された結果セットを反復処理することも可能です。本トピックでは、シンプルおよび複雑なシナリオの例を用いて、do-while ノードの設定方法を説明します。
前提条件
-
do-while ノード内のワークフローのカスタマイズ方法を理解していること。詳細については、「ノードコンポーネントとワークフローのオーケストレーション」をご参照ください。
-
ノード内でループ関連パラメーターを取得するためにビルトイン変数を使用できること。詳細については、「ビルトイン変数」をご参照ください。
-
do-while ノード内では、開始ノードがループの開始位置を示し、終了ノードがループの終了ロジックを定義することを理解していること。詳細については、「ループ終了の例:終了ノードのコードサンプル」をご参照ください。
-
do-while ノードのテスト方法およびログの確認方法に関する注意事項を理解していること。詳細については、「注意事項」をご参照ください。
制限事項
-
do-while ノードは DataWorks Standard Edition 以降でのみ利用可能です。詳細については、「DataWorks エディションの機能」をご参照ください。
-
do-while ノードの最大ループ回数は 1,024 回です。
-
並列実行はサポートされていません。新しいループは、前のループが完了した後にのみ開始できます。
do-while ノードの作成
DataWorks コンソールにログインします。対象のリージョンで、左側のナビゲーションウィンドウから をクリックします。ドロップダウンリストからワークスペースを選択し、入力 データ開発 をクリックします。
-
do-while ノードを作成します。
-
Data Studio ページで、
アイコンにポインターを合わせ、 の順に選択します。または、ワークフローを開き、General を右クリックして、 を選択することもできます。
-
Create Node ダイアログボックスで、ノード名とパスを指定します。
-
OK をクリックします。
-
使用例
本セクションでは、do-while ノードを使用して 5 回ループし、各反復で現在のループ回数を出力する方法を説明します。以下はエンドツーエンドの手順です。
ノードコードの編集
do-while ノードにはデフォルトで次の 3 つのノードが含まれます:開始、Shell、および 終了。
-
開始 ノードはループの開始位置を示すもので、ビジネス上の目的はありません。このノードは削除できません。
-
Shell ノードは、DataWorks が提供するビジネス処理ノードのサンプルです。
-
終了 ノードはループの終了位置を示し、次の反復を開始するかどうかを判断します。do-while ノードの終了条件を定義するために使用され、削除できません。
必要に応じて、Shell ノードを他のノードに置き換えることで、do-while ノード内のワークフローをカスタマイズすることもできます。
-
Shell ノードをダブルクリックして、編集ページを開きます。
-
次のコードを入力します。
echo ${dag.loopTimes} ----ループ回数を出力します。-
${dag.loopTimes} 変数はシステム予約変数であり、現在のループ回数(1 から開始)を表します。do-while ノードの内部ノードは、この変数を直接参照できます。ビルトイン変数の詳細については、「ビルトイン変数」および「コンテキスト依存変数」をご参照ください。
-
Shell ノード内でコードを変更した後は、必ず保存してください。ノードを送信してもプロンプトは表示されません。保存しない場合、最新の変更内容は適用されません。
-
ループ終了条件の定義
5 回目の反復でループを終了するように終了条件を定義します。
-
終了ノードをダブルクリックして、編集ページを開きます。
-
言語の選択 ドロップダウンリストで、Python を選択します。
-
do-while ノードの終了条件を定義するため、次のコードを入力します。
if ${dag.loopTimes}<5: print True; else: print False;-
${dag.loopTimes} 変数はシステム予約変数であり、現在のループ回数(1 から開始)を表します。do-while ノードの内部ノードは、この変数を直接参照できます。ビルトイン変数の詳細については、「ビルトイン変数」および「コンテキスト依存変数」をご参照ください。
-
コードは
dag.loopTimesと 5 を比較し、ループ反復の総回数を制限します。1 回目の反復では dag.loopTimes は 1、2 回目は 2、…、5 回目は 5 になります。この時点で式 ${dag.loopTimes}<5 は False と評価され、ループが終了します。
-
do-while ノードの送信
-
ツールバーの
アイコンをクリックしてノードを保存します。 -
ツールバーの
アイコンをクリックしてノードを送信します。ノードを送信する際、Submission ダイアログボックスで Change Description を入力し、ノード送信後にコードレビューを開始するかどうかを指定します。
重要-
ノードを送信する前に、Rerun attribute および Parent Nodes を設定する必要があります。
-
コードレビューはタスクコードの品質を保証し、未レビューのコードがそのまま本番環境にデプロイされることによるエラーを防止します。コードレビューが有効になっている場合、送信されたノードコードはレビュアーの承認を得た後でなければデプロイできません。詳細については、「コードレビュー」をご参照ください。
標準モードのワークスペースを使用している場合は、ノード送信後にノード編集ページの右上隅にある [デプロイ] をクリックして、タスクを本番環境にデプロイする必要があります。詳細については、「ノードのデプロイ」をご参照ください。
-
テストと実行ログの確認
do-while ノードの送信およびデプロイプロセスは通常のノードと同じです。オンライン実行プロセスも同様ですが、Data Studio インターフェイスからのテストはサポートされていません。
DataWorks が標準モードの場合、Data Studio インターフェイスから do-while ノードを直接テストすることはできません。
do-while ノードの実行結果をテストおよび検証するには、do-while ノードを含むタスクを送信・デプロイしてオペレーションセンターに配置し、オペレーションセンターのページから do-while ノードタスクを実行する必要があります。do-while ノード内で代入ノードから渡された値を使用する場合は、オペレーションセンターでのテスト時に代入ノードと do-while ノードの両方を一緒に実行してください。
-
ページ右上隅の O&M Personnel をクリックして、Operation Center に移動します。
-
左側のナビゲーションウィンドウで、 をクリックします。
-
目的のノードを選択します。右側の DAG で、代入ノードを右クリックし、 を選択します。
-
Data Backfill Instance ページを更新します。バックフィルインスタンスが正常に実行されたら、インスタンス横の DAG をクリックします。
-
do-while ノードの実行ログを確認します。
-
do-while ノードを右クリックし、View Inner Nodes を選択します。
do-while ノードのような複合ノードでは、詳細な実行ログを確認するために内部ノードを表示する必要があります。本例では、ループが 5 回実行され、すべての反復が正常に完了しました。
do-while ノードの内部ループ本体は次の 3 つの部分で構成されます。
-
ビューの左側には、do-while ノードの再実行履歴リストが表示されます。do-while インスタンス全体が実行されるたびに、履歴リストに該当レコードが追加されます。
-
中央セクションにはループレコードリストが表示され、ループ反復の総回数および各反復のステータスが表示されます。
-
ビューの右側には各反復の詳細が表示されます。ループレコードリストで反復をクリックすると、その反復における各インスタンスの実行ステータスが表示されます。
-
-
内部ノードページで、左側の反復番号をクリックし、目的のノードを右クリックして、実行ログの表示 を選択します。
-
N 回目の反復の詳細な実行ログを確認します。
内部ノードページで、左側の 反復 5 をクリックして、5 回目の反復における Shell ノードのログを確認します。
ランタイムログには、5 回目の反復で終了ノードが評価コード
if 5 < 5: print True else: print Falseを実行し、出力結果がFalse(出力結果: False)であったことが示されています。これによりループが終了し、タスクが正常に完了しました。本例に示されているように、do-while ノードのワークフローは次のとおりです。
-
開始ノードから実行を開始します。
-
定義された依存関係に基づいて、タスクが順次実行されます。
-
終了ノードで終了条件が定義されます。
-
一連のタスクが完了すると、終了ノード内の終了条件文が実行されます。
-
終了ノード内の評価文がログに出力した結果が True の場合、ステップ 1 からループが継続します。
-
終了ノード内の評価文がログに出力した結果が False の場合、ループ全体が終了し、do-while ノードが完了します。
-
-
まとめ
-
次の表は、do-while ノードと while、for-each、および do-while ループタイプを比較したものです。
-
do-while ノードは do...while ループパターンをサポートしており、まずループ本体を実行してから条件を評価します。また、システム変数 dag.offset をノードコンテキストと組み合わせることで、foreach パターンを間接的に実装することも可能です。
-
do-while ノードは、ループ本体を実行する前に条件を評価する while ループパターンをサポートしていません。
-
-
do-while ノードの実行フロー:
-
開始ノードから開始し、定義された依存関係に基づいてループ本体のタスクが順次実行されます。
-
ユーザーが終了ノードで定義したコードが実行されます。
-
終了ノードが出力した結果が True の場合、次の反復が開始されます。
-
終了ノードが出力した結果が False の場合、ループが終了します。
-
-
-
コンテキスト依存関係の使用:do-while ノードの内部ノードは、${dag.context 変数名} を使用して、do-while ノードに対して定義されたノードコンテキストを参照できます。
-
システムパラメーター:DataWorks は、do-while ノードの内部ノード向けに次の 2 つのシステム変数を自動的に提供します。
-
dag.loopTimes:1 から始まるループ回数。
-
dag.offset:最初の反復に対する現在の反復のオフセット(0 から開始)。
-