はじめに
Azure Data Factory(ADF)の「Copy Data(データのコピー)」を使用してデータを取得する際、日付の範囲を指定して一括取得しようとすると、コピー元のデータベースのメモリ上限に達してしまうことがありました。そのため、日付を指定して1日分ずつデータを取得し、繰り返し処理を行う方法で日々の取得は乗り切っています。
しかし、過去のデータを数カ月分まとめて取得したい、といった時にはこの手段では逐一パイプラインの変数を指定し直して実行、としなければなりません。
そこで、Until アクティビティ を使用して、Set Variableのにおける変数の値をインクリメント(少しずつ増や)して、データのコピーを行いました。Untilアクティビティの使い方が分かりづらかった(DataFactoryは何をするにしても全て分かりにくいが…。)ため、備忘的に記事にします。
※自宅のAzure環境では英語のままつかっているのですが、職場の環境では日本語にして使用しています。画面に表示されている名称について言及する際はカッコ内に日本語表示を記載しています。
手順
-
変数の作成
まずはパイプラインの変数を作成します。Variablesを開き、変数を設定していきます。
「データのコピー」アクティビティでstring型の日付の値が必要なため、strDateを作成し、Until処理の中で1つずつ値を増やしていきたいのでinteger型のintDateも作成します。
-
Set Variable(変数の設定)を配置
General(一般)の中にあります。
このSet variableは「変数の初期値」となります。string型の日付であるstrDateを設定しておきます。
-
Until(まで)を配置
余談ですが、ADFを日本語バージョンにしているとUntilアクティビティは「まで」と表示されると思います。気持ち悪いです。
Untilアクティビティはアクティビティリスト内の「Iteration & conditionals(繰り返しと条件)」の中にあります。
先ほどのSet variableからSuccess(成功)の緑の矢印を引いて繋げておきます。これでSet variableが正常に動作した場合次の処理へ移ってくれます。
-
Untilの内部にSet variableを2つ配置します。
Untilアクティビティに出ている鉛筆マークをクリックするとUntil内部に遷移するので、そこで作業してもいいし、青丸のプラスマークを押すとアクティビティを内部に追加出来るのでそこから作業してもいいです。
↓これはUntil内部に遷移した状態の画面で、「pipeline1 > Until1」と左上に出ているところで現在の位置を確認出来ます。
-
それぞれのSet variableを設定
1つ目:Untilの外側に置いたstrDateをUntilの中に受け取る役割と、string型をinteger型に変更する役割を担ってもらう部分です。
Setting(設定)画面から、変数を選択し(intDate)、Value(値)の部分はAdd dynamic Content(動的なコンテンツの追加)を開き、int関数を使って受け取った変数(strData)をint型に変更します。
2つ目:intDateの値を1つ増やす部分です。
1つ前のSet variableからinteger型の変数(intDate)を受け取って、add関数を使って値を1つ増やします。その後の処理でstring型で使用するのでstring関数でデータ型変更も行っています。
-
Untilの条件を設定
Untilが終了する条件を設定します。
Until内部から出て、UntilアクティビティのSettingsを開き、Expression(式)を設定します。今回は適当なので、「strDateが20250110と等しくなったら」にします。
-
デバッグをして変数の値の遷移を確認
Untilの外部にあるSet Variableの値は20250101で想定通りです。
Until内部で変数を受け取った直後の値も20250101で想定通りです。
Until内部の2つ目のSet Variableでは、想定通り、+1されて20250102となっています。
2つ目のSet variableの値は順調に増えて、Untilの終了条件に入れた「strDateが20250110と等しくなったら」でパイプラインの実行が終了しました。
これを活用すれば、SQL文などの日付をインクリメントしてCopy dataアクティビティを回すことが出来ます。
何がわかりにくかったのか
直感的にはSet variableを1つだけおき、Add Dynamic Contentsに
@string(add(int(variables('strDate')),1))
のような感じでいけると思ったのですが、自己参照になっているというエラーが出てしまうため、2つのSet variableを使うこととなりました。
課題
初期値を1に設定していても、1回目の実行で最初に+1されてしまうので、1回目の実行で「1」ではなく「2」になってしまうという課題があります。今回は日付をインクリメントしたいので、初期値を「20250100」のような奇妙な値に設定しなければなりませんでした。また、「日付」として処理していないので、Untilの終了条件は必ず「20250131」としないと、次の値が「20250132」になり、後続のCopy Dataなどでエラーとなります。(今回の要件では1日分ずつしか取得出来ないほど巨大なテーブルなので、1月1日~1月31日まで回すだけで実行時間が長くなりすぎてしまうため一旦気にしないこととしましたが、日付としてきちんと取り扱いたい場合はまた違った考慮が必要になります。)