DataWorks は、「最初に実行し、次に条件を評価する」というループ ロジックを実装した do-while ノード を提供します。このノードは、ファイルの存在をポーリングで確認したり、ソースが空になるまでデータをバッチ処理したりするなど、動的な条件が満たされるまで一連のタスクを繰り返す必要がある場合に最適です。ループ本体内でタスクフローを構成し、専用の End ノードを使用してループの終了を制御できます。
ユースケース
データ開発において、do-while ノードは、条件に基づいてタスクを繰り返し実行する 必要があるワークフローの設計を簡素化します。一般的なユースケースは次のとおりです。
API ポーリング:
SUCCESSなどの特定のステータスが返されるか、レスポンスデータが要件を満たすまで、API を繰り返し呼び出すことです。データ準備状況のチェック:上流のファイルまたはデータパーティションが生成されるのを待ちます。ループは反復ごとにデータをチェックし、データが利用可能になると終了して、下流のタスクをトリガーします。
バッチデータ処理:代入ノードのような上流ノードから提供された、テーブル名や日付パーティションなどのアイテムのリストを処理します。do-while ノードはリストを反復処理し、リストがなくなるまで一度に 1 つのアイテムを処理します。
ステータス同期:外部サービスのステータスを繰り返しチェックします。サービスのステータスが「Available」や「Complete」のような望ましい状態に変わると、ループは終了し、後続のデータ同期または処理ワークフローをトリガーします。
注意事項
エディション:DataWorks Standard Edition 以上。
権限: DataWorks ワークスペースでは、[開発] または [ワークスペース管理者] ロールが必要です。詳細については、「ワークスペースにメンバーを追加する」をご参照ください。
仕組み
do-while ノードは、「最初に実行し、次に条件を評価する」 メカニズムに基づくループコンテナとして機能します。
Start ノード → ループ本体 (タスクの実行) →
End ノード (条件の評価)
開始と実行:ループは
Start ノードで開始され、ループ本体内のすべてのタスクが少なくとも 1 回実行されます。条件の評価:ループ本体が完了した後、
End ノードが実行されます。このノードに条件ロジックを記述します。ループの判定:
「終了」ノードが文字列 Trueを出力する場合、新しいイテレーションが開始されます。
終了ノードが文字列 Falseを出力する場合、ループは終了し、do-while ノード全体の実行は成功と見なされます。
主な特徴:ループ本体は、初期条件に関係なく、常に少なくとも 1 回は実行されます。
ノードのコンポーネント
do-while ノードをダブルクリックすると、内部キャンバスが開きます。これは主に 3 つの部分で構成されています。
Start ノード:ループのエントリポイントです。編集または削除はできません。ループ本体:タスク用のカスタマイズ可能なキャンバスです。 [内部ノードの作成] をクリックして、Shell、SQL、Python などのさまざまなタイプの内部ノードを追加し、反復可能なビジネスプロセスを構成できます。
終了ノード: ループの判定ノードであり、ODPS SQL、Shell、または Python を使用して TrueまたはFalseの文字列を出力する代入ノードです。この文字列によって、ループを継続するかどうかが決まります。
組み込み変数
do-while ノードのループ本体と End ノードでは、次の組み込み変数を使用して、現在のループ状態と入力データにアクセスできます。
変数 | 説明 |
システム組み込み変数 | |
| 現在の反復回数。 1 から始まります。 |
| 現在のイテレーションのオフセットは 0 から始まり、 |
代入ノードと併用 | |
| 上流ノードからの結果セット全体を返します。通常は 2 次元配列です。 |
| 結果セットの行数 (要素数) を返します。 |
| 現在のループで処理しているデータ行を取得し、それを |
| 行 |
例:${dag.input[0][1]}は、1 行目の 2 列目から値"beijing"を抽出します。
制限事項
エディションの要件:この機能は DataWorks Standard Edition 以降 で利用可能です。
反復回数の上限:デフォルトの最大反復回数は 128 回で、最大 1024 回まで調整可能です。この上限を超えるとタスクは失敗します。
実行モデル:ノードは 逐次実行モデル を使用します。これは、各反復が完了してから次の反復が開始されることを意味します。
デバッグの制限:DataStudio で do-while ノードを直接実行してテストすることはできません。まず ワークフローを公開 し、その後 オペレーションセンター の データ補完 機能を使用して動作を検証する必要があります。
データ依存関係:ループが上流の代入ノードに依存する場合、データリネージの完全性を確保するために、上流ノードからデータ補完を開始 してください。
フロー制御:ループ本体内で 分岐ノード を使用する場合、ワークフローの破損を防ぐために、すべての分岐が最終的に 合流ノード で合流するようにしてください。
手順:単純なループタスクの作成
この例では、5 回ループするタスクを作成する方法を示します。反復ごとに、タスクは現在のループ番号を出力します。
ステップ 1:ループ本体の設定
ワークフローに
do-whileノードを作成します。ノードをダブルクリックして内部キャンバスを開きます。 ループ本体エリアで、[内部ノードの作成] をクリックし、[Shell] を選択して、ノードに
print_loop_timesという名前を付けます。Shell ノードを右クリックし、 [ノードを開く] を選択します。
コードエディターに、次のコマンドを入力します。
# 組み込み変数 ${dag.loopTimes} を使用して現在のループ回数を取得します echo "This is loop number: ${dag.loopTimes}"保存アイコンをクリックして変更を保存します。
ステップ 2:終了条件の定義
do-while の内部キャンバスに戻ります。
End ノード を右クリックし、 [ノードを開く] を選択します。言語を [Python] に切り替えます。
次の Python コードを入力します。
# ループ回数が 5 未満の場合はループを続行し、それ以外の場合はループを終了します。 if ${dag.loopTimes} < 5: print(True) else: print(False)End ノードを保存します。
ステップ 3:公開、実行、検証
メインのワークフローキャンバスに戻り、ツールバーの [公開] ボタンをクリックして、ワークフロー全体を公開します。
[オペレーションセンター] に移動し、
do-whileノードを見つけます。ノードを右クリックし、 [データ補完] > [現在のノード] を選択してテスト実行を開始します。
インスタンスが正常に実行された後、再度右クリックして [内部ノードの表示] を選択します。
5 つのイテレーションレコードを確認します。いずれかのイテレーション (たとえば 5 番目) を展開します。内部の
print_loop_timesインスタンスを右クリックし、[ランタイムログの表示] を選択します。次の出力が表示されます。This is loop number: 5
高度なユースケース:データリストの処理
一般的で実用的なパターンは、do-while ノードを使用して、上流の代入ノードによって生成されたデータセットを反復処理することです。このシナリオでは、上流の ODPS SQL 代入ノードが 2 行のユーザー情報をクエリし、do-while ノードが各行を処理します。
ステップ 1:代入ノードの設定
[代入ノード](たとえば、
assign_sql_dataという名前)を作成し、それをdo-whileノードの上流の依存関係として設定します。ノードで [ODPS SQL] を使用してデータをクエリします。
SELECT 'user_A', 'beijing' UNION ALL SELECT 'user_B', 'shanghai';ノードを保存します。
outputsパラメーターには、2 行のデータを含む 2 次元配列が格納されます。
ステップ 2:do-while ノードの設定
do-whileノードの右側にある[スケジューリング設定] パネルで、[入力パラメーター] セクションを探します。[追加] をクリックし、次のパラメーターを設定します。
名前:
input(カスタマイズ可能)値ソース:
assign_sql_data.outputsを選択します
do-whileノードの[ループボディ]に新しい Shell ノードを作成し、現在の行を処理するために以下のスクリプトを入力します。# 現在の反復で処理されているデータ行を取得します echo "Processing data row: ${dag.input[${dag.offset}]}"
End ノード を開き、Python を使用して終了条件を設定します。# 処理するデータ行がまだある場合は、ループを続行します。 if ${dag.loopTimes} < ${dag.input.length}: print(True) else: print(False)ワークフローを公開し、運用センターで、データのバックフィルは
assign_sql_dataノードから開始して、データがループに正しく流れるようにします。
実行が成功すると、実行ログで 2 回のイテレーションでそれぞれ "user_A,beijing" と "user_B,shanghai" が処理されたことを確認できます。
付録:do-while ノードと for-each ノードの比較
機能 | do-while ノード | for-each ノード |
コアロジック | 条件駆動:条件が満たされなくなるまで実行を繰り返します。 | データ駆動:入力リストの各要素に対して 1 回実行されます。 |
反復回数 | 不確定。条件がいつ満たされるかによって決まります。 | 確定的。入力リストの要素数と等しくなります。 |
実行保証 | 初期条件が満たされなくても、少なくとも 1 回は実行されます。 | 入力リストが空の場合、まったく実行されません。 |
ユースケース | ポーリング、待機、ステータスチェック、ソースが空になるまでのバッチ処理。 | 既知のリストのバッチ処理 (一連のテーブルの同期や複数のパーティションの処理など)。 |
制御方法 | [終了ノード] は | すべての要素を反復処理した後に自動的に終了します。 |