do-while ノードで、end という名前のループ決定ノードを含む相互依存ノードを定義することができます。 DataWorks は、ノードを繰り返し実行し、終了ノードが False を返す場合にのみループを終了します。

  • Do-while ノードは、DataWorks Standard Edition 以降でのみ使用可能です。
  • ループは最大 128 回繰り返すことができます。 ループカウントがこの制限を超えると、エラーが生じます。

do-while ノードは、ODPS SQL、SHELL、および Python 言語をサポートします。 ODPS SQL を使用する場合、CASE WHEN ステートメントを使用して、ループを終了するために指定された条件が満たされているかどうかを評価することができます。

簡単な例

本セクションでは、do-while ノードを使用してループを 5 回繰り返し、ループが実行されるたびにループカウントを表示する方法について説明します。
  1. DataWorks コンソールにログインします。 左側のナビゲーションウィンドウでワークスペースをクリックします。 ワークスペースぺージで、ターゲットのワークスペースを探して、アクション列の [データ分析] をクリックします。
  2. 表示される [データ分析] タブで、ポインターをアイコンの作成アイコンの上に移動して、[全般] > [do-while] をクリックします。

    または、左側のナビゲーションウィンドウでワークフローをクリックし、[全般] を右クリックしてから、[作成] > [do-while] をクリックします。

  3. 表示される ノードの作成 ダイアログボックスでノード名地域を設定し、[コミット] をクリックします。
    ノード名は 1~128 文字にする必要があります。
  4. 作成された do-while ノードをダブルクリックします。 表示されるノード構成タブで、ループ本体を定義します。
    デフォルトでは、do-while ノードは開始ノード、SQL ノード、終了ノードで構成されます。
    • 開始ノードはループの開始をマークします。ビジネスへの影響はありません。
    • DataWorks は、サンプルのビジネス処理ノードとして SQL ノードを提供します。 SQL ノードを、たとえば、Display loop count という名前のシェルノードなどの独自のビジネス処理ノードに置き換える必要があります。
    • 終了ノードは、ループの終了をマークし、ループを再び開始するかどうかを決定します。 この例では、do-while ノードのループを終了するための条件を定義しています。

      終了ノードは割り当てノードです。 ループを再度開始するか、ループを終了するかを示す True または False のみを生成します。

      ${dag.loopTimes} 変数は、ループカウントの表示ノードと終了ノードの両方で使用されます。 これは、DataWorks の予約変数です。 この変数は、ループカウントと値の増分を 1 から表します。 do-while ノードの内部ノードは、この変数を直接参照することができます。

      前の図に示されているコードでは、dag.loopTimes 変数はループカウントを制限するために 5 と比較されます。 dag.loopTimes 変数の値は、ループが最初に実行されるときは 1 で、毎回 1 ずつ増加し、たとえば、2 回目は 2 となります。 5 回目のループの実行時の値は 5 となります。 この場合、条件付きステートメント ${dag.loopTimes}<5 は False を返し、do-while ノードがループを終了します。

  5. do-while ノードを実行します。

    必要に応じて do-while ノードのスケジューリングプロパティを設定し、do-while ノードを実行するためにオペレーションセンターにコミットします。

    • do-while ノード:do-while ノードは、オペレーションセンターでノード全体として表示されます。 do-while ノードに関するループの詳細を表示するには、有向非巡回グラフ (directed acyclic graph, DAG) のノードを右クリックして、 [内部ノードを表示] をクリックします。
    • 内部ループ本体:このビューは 3 つの部分に分かれています。
      • ビューの左側のウィンドウには、do-while ノードの再実行履歴が記載されます。 レコードは、do-while ノードインスタンスが実行されるたびに生成されます。
      • ビューの中央ウィンドウには、ループレコードリストが表示されます。 do-while ノードのループが実行されるたびにレコードが生成されます。 各時間の実行ステータスも表示されます。
      • ビューの右側のウィンドウには、ループが実行されるたびに do-while ノードに関する詳細が表示されます。 ループレコードリストのレコードをクリックして、実行中の詳細を表示することができます。
  6. 実行結果を表示します。

    内部ループ本体を表示します。 ループレコードリストで、3 回目に対応するレコードをクリックします。 実行時ログのループカウントは 3 です。

    ループが 3 回目と 5 回目にそれぞれ実行されたときに生成される終了ノードの実行時ログを表示することもできます。

    前の図に示すように、ループが 3 回実行されると条件付きステートメント 3<5 は True を返し、ループが 5 回実行されると条件付きステートメント 5<5 は False を返します。 do-while ノードは、5 回目のループ実行後にループを終了します。

前述の簡単な例に基づいて、do-while ノードは次のように機能します。
  1. 開始ノードから実行します。
  2. 定義されたノードの依存関係に基づいて、ノードを順番に実行します。
  3. 終了ノードでループを終了するための条件を定義します。
  4. ループが初めて終了した後、終了ノードの条件付きステートメントを実行します。
  5. ループカウントを 1 として記録し、条件付きステートメントが終了ノードの実行時ログで True を返す場合、ループを再度開始します。
  6. 終了ノードの実行時ログで条件付きステートメントが False を返す場合、ループを終了します。

複雑な例

簡単なシナリオに加えて、do-while ノードは、ループを使用してデータの各行が順番に処理される複雑なシナリオでも使用することができます。 そのようなシナリオでデータを処理する前に、次のことをご確認ください。
  • 照会データを do-while ノードにエクスポートできる親ノードをデプロイしました。 割り当てノードを使用して、この条件を満たすことができます。
  • do-while ノードは、親ノードの出力を取得すうrことができます。 この条件を満たすようにノードコンテキストと依存関係を設定することができます。
  • do-while ノードの内部ノードは、データの各行を参照することができます。 この例では、既存のノードコンテキストを拡張し、do-while ノードのコンテキストを参照するためにシステム変数 ${dag.offset} を使用します。
本セクションでは、do-while ノードを使用して、ループが実行されるたびに tb_dataset テーブルの 2 行のデータ 0 と 1 をそれぞれ表示する方法について説明します。
  1. データ分析 タブで、ポインターをアイコンの作成アイコンの上に移動して、[全般] > [do-while] をクリックします。

    または、左側のナビゲーションウィンドウでワークフローをクリックし、[全般] を右クリックしてから、[作成] > [do-while] をクリックします。

  2. 表示されるノードの作成 ダイアログボックスでパラメーターを設定し、[コミット] をクリックします。
  3. 作成された do-while ノードをダブルクリックします。 表示されるノード構成タブで、ループ本体を定義します。
    1. Initialize dataset という名前の割り当てノードを作成し、do-while ノードの親ノードとして追加します。 親ノードはテストデータセットを生成します。
    2. do-while ノードのプロパティタブの、パラメーターセクションで、入力パラメーターを定義します。 入力するパラメータ名を設定し、値ソースを親ノードの出力に設定します。
    3. 各データ行の印刷という名前のビジネス処理ノードのコードを記述します。
      • ${dag.offset}:DataWorks の予約変数です。 この変数は、ループカウントのオフセットを 1 と表します。 たとえば、ループが最初に実行されるときのオフセットは 0 で、2 回目には 1 となります。 オフセットは、ループカウントから 1 を引いた値に等しくなります。
      • ${dag.input}:do-while ノードに設定するコンテキストです。 前の手順では、do-while ノードの入力パラメーターが定義され、入力パラメーターの値は、Initialize dataset という名前の親ノードの出力です。

        do-while ノードの内部ノードは、 ${dag.${ctxKey}} を直接使用してコンテキストを参照します。 この例では、${ctxKey} が入力に設定されています。 ${dag.input} を使用して、コンテキストを参照します。

      • ${dag.input[${dag.offset}]}:Initialize dataset ノードによって生成されたテーブルから取得したデータです。 DataWorks は、指定されたオフセットに基づいてテーブルからデータの行を取得することができます。 ${dag.offset} 変数の値は 0 から増加します。 データセット内のすべてのデータが返されるまで、${dag.input[0]}${dag.input[1]} のようなデータが返されます。
    4. 終了ノードでループを終了するための条件を定義します。 次の図に示すように、$ {dag.loopTimes}${dag.input.length} 変数が比較されます。 前者の値が後者の値よりも小さい場合、終了ノードは True を返し、do-while ノードはループを継続します。 それ以外の場合、終了ノードは False を返し、do-while ノードはループを終了します。
      システムは、${dag.input.length} 変数を、do-while ノード用に設定されたコンテキストに基づいて、入力パラメーターで指定された配列内の行数に自動的に設定します。
  4. do-while ノードを実行して、実行結果を表示します。

    ループが初めて実行されるとき、ループカウントはデータ行の数よりも少なくなります。 終了ノードは True を返し、ループが継続します。 ループカウントは、ループが 2 回実行されるときのデータ行の数に等しくなります。 終了ノードは False を返し、ループは終了します。

概要

  • while、foreach、および do...while ステートメントを比較すると、do-while ノードには次の特徴があります。
    • do-while ノードには、条件付きステートメントを評価する前にループを実行するループ本体が含まれています。 このノードは、do...while ステートメントと同じように機能します。 do-while ノードは、システム変数 ${dag.offset} とノードコンテキストを使用して、foreach ステートメントの機能を実装することもできます。
    • do-while ノードは、条件付きステートメントを評価する前にループを実行するため、while ステートメントの機能を実現することができません。
  • do-while ノードは次のように機能します。
    1. ノードの依存関係に基づいて、開始ノードからループ本体内のノードを実行します。
    2. 終了ノードに定義されたコードを実行します。
      • 終了ノードが True を返す場合、ループを再度実行します。
      • 終了ノードが False を返す場合、ループを終了します。
  • ノードコンテキストの使用方法:do-while ノードの内部ノードは、${dag.${ctxKey}} を使用してdo-while ノード用に定義されたコンテキストを参照します。
  • システムパラメーター:DataWorks は、do-while ノードの内部ノードに次のシステム変数を提供します。
    • ${dag.loopTimes}:1 から始まるループカウントです。
    • ${dag.offset}:0 から始まるループカウントの 1 へのオフセットです。