Azure DataFactoryでファイル分割する

前回以下のような記事を投稿させていただきました。
[PolyBaseとCOPYはどっちがロードが早いか検証してみた（Azure Synapse Analytics SQLプール）](https://qiita.com/masahiro-yamaguchi/items/18fc3e299634bbdf04dd)

Azure Synapse Analytics SQLプールではデータベースへロードするファイルを、ロードの速度の観点から何かと分割する事が多いです。
何かいい方法が無いかと調べていましたらAzure DataFactoryを使えば簡単にファイルの分割が出来そうでしたので本記事にまとめておこうと思います。

※既にAzure DataFactory V2はリソース作成されている前提で記載をいたします。

#Azure PortalよりOpen Azure Data Factory Studioを起動
まずは対象のAzure DataFactoryからOpen Azure Data Factory Studioを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/7f675d73-8cca-2735-5c31-6e73b94b0ba8.png)

#データセットの作成
Open Azure Data Factory Studioが起動したら、分割対象のファイルと、分割後のファイルをそれぞれデータセットして登録します。
以下の通り、「データセット」→「新しいデータセット」でデータセットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/37316fef-f794-de20-0475-9c028dc12190.png)

##分割対象となる入力ファイル用のデータセットの作成
###データストアの選択
今回はAzure Data Lake Storage Gen2のデータを対象としますので、「Azure Data Lake Storage Gen2」をデータストアとして選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/d1134ed7-11f0-c2dc-02ae-5108fe2abf7e.png)
###データの形式の選択
対象のファイルはCSVファイルとなるため、「DelimitedTxet」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/267d46e4-5469-ade8-8c29-c991a60739e9.png)
###各種プロパティの設定
データセットの各種プロパティを入力します。「名前」、「リンクサービス」、「ファイルパス」を指定します。ファイルパスはAzure Data Lake Storage Gen2上の対象のファイルを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/a6b15bd9-30c5-4f34-769d-9a2615c6d151.png)

※また、リンクサービスが存在してなかったので、上記画面上で、Azure Data Lake Storage Gen2へのリンクサービスの作成も行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f8d0c0a1-b240-a6db-8a4f-653da1a08aa6.png)

###その他の設定
各種プロパティの設定後、その他の設定値を変更します。当該CSVですが、区切り文字が「パイプ(|)」なので変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/c666e23d-22f2-1c0e-9c1b-5f4449af7d65.png)

さらに、「スキーマ」タブより「スキーマのインポート」→「接続またはストアから」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/e1aee073-12f8-6c97-f761-a9692bb03404.png)

##分割後の出力ファイル用のデータセットの作成
次に分割後の出力ファイル用のデータセットの作成をします。基本は「分割対象となる入力ファイル用のデータセットの作成」と同じなので、似たような場所は割愛し、各種プロパティの設定から記載します。
###各種プロパティの設定
「名前」や「リンクサービス」を指定します。またファイルパスですが今回は、「ファイル システム」、「ディレクトリ」のみ指定し、「ファイル」は空白のままとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/6ee0efad-3c03-559f-bea5-f5c91f8478dd.png)

##その他の設定
こちらも入力ファイルと同様に「列の区切り記号」を「パイプ(|)」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/4a5810cf-8b67-7fd3-82fd-81eb20885739.png)

#データフローの作成
次にデータフローの作成を行います。
「データフロー」→「新しいデータフロー」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/d43031fd-b3ea-cffc-cfc1-f257eaba815f.png)

##ソースの追加
以下の通りソースの追加を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/489d88dc-6847-ce26-e1d7-52f6a237c326.png)

###ソースの設定
「出力ストリーム名」に適当な名前を入力し、ソースの種類に「データセット」を選択、「データセット」では先ほど作成した分割対象となる入力ファイル用のデータセットである「customer_org」を入力。
※ついでに右側のプロパティでこのデータフローの名前も入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/977eacbe-79ba-3255-a0da-d9fc31d40400.png)

##シンクの追加
以下の通り、「＋」を押下して、「シンク」を選択し、データフローにシンクを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/8c03222e-f239-27a7-62f7-6df0355ec3e5.png)

###シンクの設定
「出力ストリーム名」に適当な名前を入力し、「着信ストリーム」は先ほど作成した、ソースを選択します。シンクの種類で「データセット」を選択し、「データセット」では分割後の出力ファイル用のデータセットとして作成した「ADF_OUT_customer」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/676bf038-4173-dc54-cf38-824115425cc1.png)

###シンクの最適化
シンクの「最適化」タブを選択します。パーティションのオプションから「パーティション分割の設定」を選択、パーティションの種類に「ラウンドロビン」を選択します。また、パーティションの数では分割後のファイル数を指定します。今回は60個のファイルに分割したいので「60」を入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/7cee62bf-3265-1cba-8718-ac1bb9033759.png)

#パイプラインの作成
次にパイプラインを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b4bf12bf-f507-9540-afde-000881d8ed57.png)

##パイプラインにデータフローを設定
先ほど作成したデータフローをドラッグ&ドロップでパイプラインに設定します。また、ついでに右側のパイプラインのプロパティでパイプラインに適当な名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/8c4a5b8d-62dc-c296-ab62-b20119c86075.png)

##パイプラインの設定
パイプライン上のデータフローが実行する時のリソースを、「設定」タブより変更できます。ファイル分割に時間がかかりすぎてしまう場合、ここを見直してみるのもいいかもしれません。※今回はデフォルトのまま設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f021bcb4-a02f-8059-82a8-5a96ebd85af7.png)

#Azure DataFactoryのデプロイ
これまで作成した各種Azure DataFactoryのリソースをデプロイします。「すべて発行」を押下すればデプロイできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b35ab820-29c3-9512-e4b5-a50278e7d9a0.png)

#パイプラインの実行
デプロイ完了後、パイプラインを実行します。「トリガーの追加」より「今すぐトリガー」にてパイプラインの実行が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/06713516-b283-202f-9c3c-573494741edb.png)

実行完了後以下の通り、60個のファイルが出力されている事がAzure Data Lake Storage Gen2の指定のディレクトリの中で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/49de5ee2-9c8e-c1ee-dc04-15a250e065fb.png)

#最後に（Azure Synapse Analytics SQLプールへの取り込み）
分割したファイルがAzure Synapse Analytics SQLプールへ取り込めるか確認します。

```SQL
COPY INTO CUSTOMER　--ロードするテーブル名を指定
FROM 'https://<ストレージアカウント名>.blob.core.windows.net/data1/ADF_OUT/part*' --ロードするファイル指定
WITH (
     FILE_TYPE = 'CSV' --ファイルフォーマット指定
    ,CREDENTIAL = (IDENTITY= 'Storage Account Key', SECRET='<ストレージアカウントのキー>') --ストレージアカウントキーで認証
    ,FIELDTERMINATOR='|' --デリミタ（|）
    ,ROWTERMINATOR = '0x0A' --改行コード（LF）
);

--件数のカウント
select count(*) from customer;
```

無事取り込みが行う事が出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/ee780455-776b-255b-9dbb-e03b2f3e786f.png)