Data Factoryのルックアップアクティビティでは、構成ファイルやテーブルの内容や、クエリやストアドプロシージャの実行結果などをオブジェクトとして動的に出力することが出来ます。
本記事では、ルックアップアクティビティを使用して、取り込んだファイルが空の場合に後続のコピーアクティビティを実行しないようなパイプラインを構成します。
実施概要
ストレージイベントトリガーを利用して、ソースストア(BLOBストレージ)にCSVファイルがアップロードされたことをトリガーとして、Data Factoryのパイプラインを実行します。
取り込まれたCSVファイルの中身をルックアップアクティビティで参照し、ファイルの中身が空の場合には後続のコピーアクティビティを実行しないように「If Condition」アクティビティを設定し、パイプラインを実行してみます。
事前準備
1.トリガーを実装するためのパイプラインを作成します。
参考:Data Factoryを使用してAzure Blob StorageからAzure SQL Databaseにデータをコピーする - JBS Tech Blog
2.パイプラインにストレージイベントトリガーを実装します。
参考:Azure Data Factoryでパイプラインにストレージイベントトリガーを実装する - JBS Tech Blog
3.トリガーに、ファイル名のメタデータを取得するためのパラメーターを設定します。
パイプラインに"trriger_fileName"パラメーターを作成します。
トリガーの編集画面で"trigger_fileName"パラメーターに、システム変数"@triggerBody().fileName"を設定します。
4.データセットにパラメーターを設定します。
ソースデータセットのパラメーターを開き、"dir"と"file"を追加します。
ファイルパスにパラメーターを設定します。
5.空のCSVファイルを用意します。
実施手順
パイプラインの実装
⑴Data Factory Studioでアクティビティリストを開き、[参照](lookup)アクティビティをドラッグ&ドロップでパイプラインに置きます。
⑵ルックアップアクティビティをクリックしてアクティビティ設定画面を開き、以下の表のように設定します。
ソースデータセット | BlobDataset |
プロパティ | ー |
dir | @string(substring(pipeline().parameters.trigger_folderPath,12,10)) |
file | @pipeline().parameters.trigger_fileName |
ファイルパスの種類 | データセット内のファイルパス |
※データセット内の設定でコンテナー(container02)の指定があるため、"trigger_folderPath"の出力パスからコンテナーをsubstring関数によって省く
⑶アクティビティリストを開いて[If Condition]をドラッグ&ドロップでパイプラインに置き、lookupアクティビティから成功の線をIf Conditionに繋げておきます。
⑷If Conditionアクティビティをクリックしてアクティビティ設定画面を開き、[式]
[動的なコンテンツの追加]をクリックします。
パイプライン式ビルダーにて以下の関数を入力します。
@contains(activity('Lookup1').output,'firstRow')
⑸Falseの右側にある鉛筆マークをクリックし、編集画面を開きます。
アクティビティリストから[失敗]アクティビティをドラッグ&ドロップでFalseアクティビティに置き、エラーメッセージとエラーコードを設定します。
左上のpipeline1をクリックしてパイプラインに戻ります。
⑹If Conditionアクティビティを後続のアクティビティと繋ぎ、[すべて発行]をクリックして設定を保存します。
パイプラインの実行と確認
⑴BLOBストレージのコンテナー内に、データが入っているCSVファイルをアップロードし、パイプラインを実行します。
If Conditionアクティビティが成功したことを確認します。
データシンク(SQL Databaseテーブル)にデータが挿入されていることを確認します。
⑵BLOBストレージのコンテナー内に空のCSVファイルをアップロードし、パイプラインを実行します。
If Condition、Fail1でエラーが出ていることを確認します。
※空のファイルでパイプラインを実行した場合はIf Conditionアクティビティで失敗となり後続のデータコピーアクティビティは実行されません
おわりに
ルックアップアクティビティやGetMetadataアクティビティは、他のアクティビティと組み合わせて条件分岐を組み立てたり、アクティビティの出力をパイプライン内で使用することが出来ます。
アクティビティ出力を使用する時の関数やパラメーターも、全て自分で書くのではなく、選択肢からワンクリックで使用することが出来るのも嬉しいポイントです...!