データセットのパラメーターを使った Azure Data Factory のパイプラインを作ってみる

[docs]() 上であまり明記されていない気がしたので、データセットのパラメーターを使用したパイプラインの作成について、簡単にまとめてみたいと思います。

# 対象シナリオ
単に作ってみただけでは面白くないので、実際に役立ちそうなシナリオを想定したいと思います。ここでは、Azure ストレージアカウントに年月日のフォルダー名で蓄積されていく CSV ファイルを、日次で別のストレージ アカウントにバックアップとして複製をとるケースを想定します。

左側のようにフォルダー構成が切られているものを、バックアップ用のフォルダー構成に対して、1段階深くコピーを作っていくイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/424f6aaa-2f18-da55-e8a2-b2a2d5e932dc.png)

# 事前準備
実際に試すためには以下のものが必要になります。

- [Azure サブスクリプション](https://azure.microsoft.com/ja-jp/free/)
- [Azure Data Factory](https://azure.microsoft.com/ja-jp/services/data-factory/) リソース（V2を使用します。任意の名前でデプロイしてください。）
- [Azure ストレージアカウント](https://azure.microsoft.com/ja-jp/services/storage/) リソース (試す分には一つあれば十分です。任意の名前でデプロイしてください。)
- CSVファイル（ファイルとして扱うだけなので、中身はなんでもOKですし、CSVでなくても実現できます。）

必須ではありませんが、手元にあると便利なものです。

- [Azure Storage Explorer](https://azure.microsoft.com/ja-jp/features/storage-explorer/)

# 実装する

## ファイルの格納
Azure ストレージアカウント上に、コピー元のコンテナーとコピー先のコンテナーを1つずつ作成します。実システムに応用する場合は、それぞれが個別のストレージアカウントに作成されることになりますが、ここでは単なるお試しなので、同一ストレージアカウントに「source」、「sink」というコンテナーを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/c9fcf4d5-338e-4548-26ea-6c983dd41331.png)

また、「source」コンテナー内には以下のように3つのフォルダを作成してCSVファイルを配置しました。ファイル名がそれぞれ異なるものを各フォルダーには配置してあります。「sink」コンテナーは空のままとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/a9071170-8aad-3c5f-bf7f-80bf1ca2e970.png)

## ADF パイプラインを作成する
Azure Data Factory の [開発画面] (https://ms-adf.azure.com/) を開きます。この後の操作は、要点のみを書いていますので、基本的な利用方法に不安がある方は事前に [docs](https://docs.microsoft.com/ja-jp/azure/data-factory/quickstart-create-data-factory-portal) を参照して操作に慣れておいてください。作成の流れは以下の通りです。

1. パイプラインを作成する
2. パイプライン パラメーターを作成する
2. データセットを作成する
3. データセットパラメーターを作成する
4. パイプライン から データセットパラメーターを作成する

### パイプラインを作成する
パイプラインのキャンバス上には、Copy data アクティビティを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/719f2d28-babe-e9a4-4d3a-2ffc27e8f34b.png)

### パイプライン パラメーターを作成する
キャンバスの何もないところを選択すると、Parameter タブが出てきます。今回はパイプラインの起動時に日時をパラメーターで指定できるようにしたいので、パラメーターを作成します。（実際のシステム構成の場合は、トリガーされた日を基準に処理させたいという事になるかと思いますが、その場合は、トリガーの起動日を参照するように変更します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/f07eaa12-82f9-052a-00a7-519b973b9699.png)

### データセット作成する
Copy data アクティビティを選択すると、Source タブ、Sink タブが表示されます。それぞれ順に設定していきます。

#### Source 側
データセットは、Azure Blob Storage, Binary を選択します。プロパティとしては任意の名称を指定します。Linked Service を設定し、CSVファイルを配置した Azure ストレージ アカウントへの接続構成が完了したら、File path 欄にはコンテナー名のみを指定します。とっても判り辛いのですが、一番左の枠だけ指定してありますので、若干、文字の色が黒いのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/d77d2d1c-217b-b7c1-ba83-f251ec14dc05.png)

Copy data アクティビティの構成画面に戻ってきたら、File path type を「Wildcard file path」に指定し、Wildcard paths のボックスにストレージアカウント上で作成したフォルダー名のプリフィクスとパイプライン パラメーターを結合したものを Dynamic content として指定します。下記の例だと

```
folder_@{pipeline().parameters.trigger_date}
```

となっていますが、「folder_」がプリフィクス部分です。ここでの注意点は、文字列とパラメーターの境界を明示的にする必要があるため、｛｝を使ってパラメーターをくくることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/b986ff9e-a338-7b4e-35cb-4621fcd65285.png)

Dynamic contents (動的コンテンツ)は関数が使えますので、パイプライン パラメーターに対して日付のシフトをするなどの加工を行うこともできます。

#### Sink 側
Source 側と同様に、データセットは、Azure Blob Storage, Binary を選択します。プロパティとしては任意の名称を指定します。Linked Service を設定し、CSVファイルを配置した Azure ストレージ アカウントへの接続構成が完了したら、File path 欄にはコンテナー名のみを指定します。間違えないようにコピー先のコンテナー名を入れてくださいね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/6f778888-605f-7e3b-aea9-c98ed8eac700.png)

### データセットパラメーターを作成する
Copy data アクティビティの構成画面に戻ってきたら、今度は、データセットの編集画面を再度開きます。（Sink dataset の右側にある「Open」をクリックします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/5c0833f3-7d3f-88ae-92f6-9eaf53f4cf0a.png)

データセットの編集画面が表示されたら、Parameter タブからパラメーターを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/2dd65b29-1c9d-c9d1-31e4-863448eed33b.png)

Connection タブから、File path の Directory 部分に動的コンテンツとして作成したパラメーターを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/0f7b494a-f610-fb15-5a0c-af4e8cb91fc0.png)

### パイプライン から データセットパラメーターを作成する
画面上部のタブから、パイプラインの編集画面に戻ります。この時、誤ってデータセットの編集タブを閉じないでください。閉じたい場合は、Save をクリックして保存するか、投じようとした際に表示されるインストラクションにしたがって保存してください。
Copy data アクティビティ内に、データセットパラメーターが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/38b5f656-c1ec-45bc-396e-05eef909624f.png)

このデータセット パラメーターに対して動的コンテンツを指定します。ここでの注意点も、文字列とパラメーターの境界を明示的にする必要があるため、｛｝を使ってパラメーターをくくることです。

最後に、Copy behavior を preserve hierarchy に指定して完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/b7994ada-7685-0b26-767c-1640e27bb795.png)

# 動かす
Debug 実行してみましょう。Debugをクリックすると、パラメーターの設定画面が出てくるので日付を8桁で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/47062131-d81a-ad3e-a574-db698b873f1e.png)

問題なく動作した場合は、画面下部に成功したことが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/bdbdb60b-c364-24f5-a54e-4c0b38209212.png)

コピー先のコンテナーに無事バックアップを取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163305/948ade5b-7eb3-8203-85a4-94cfdd7796a6.png)

# まとめ
今回は、Data Factory のデータセット パラメーターを使用したパイプラインを作成してみました。今回の記事内で使用した、パイプライン パラメーター、データセット パラメーター以外にも、[グローバルパラメーター](https://docs.microsoft.com/ja-jp/azure/data-factory/author-global-parameters)、[Linked Service パラメーター](https://docs.microsoft.com/ja-jp/azure/data-factory/parameterize-linked-services)が利用できます。パラメーターを導入することで、接続先ごとに Linked Service を作成しなくてよくなったり、データセットの流用ができるようになります。