Azure Data Factory にて階層構造をソースとしたコピーアクティビティ実施時の表形式へのシンク方法

## 概要

Azure Data Factory にて階層構造をソースとしたコピーアクティビティ実施時の表形式へのシンク方法を紹介します。 Saleforce REST API により Salesforce から CSV などの表形式のシンク先へデータ連携する際に本手順が必要となります。

Salesforce REST API にて SOQL （Salesforce Object Query Language）によりデータを取得する場合には下記のような json がリターンされます。`records`というオブジェクトにて取得したいレコードが格納されており、配列の階層構造となっております。

> ```json
> {
>     "done" : true,
>     "totalSize" : 14,
>     "records" : 
>     [ 
>         {  
>             "attributes" : 
>             {    
>                 "type" : "Account",    
>                 "url" : "/services/data/v60.0/sobjects/Account/001D000000IRFmaIAH"  
>             },  
>             "Name" : "Test 1"
>         }, 
>         {  
>             "attributes" : 
>             {    
>                 "type" : "Account",    
>                 "url" : "/services/data/v60.0/sobjects/Account/001D000000IomazIAB"  
>             },  
>             "Name" : "Test 2"
>         }, 
> 
>         ...
> 
>     ]
> }
> ```

引用元：[SOQL クエリを実行する | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/dome_query.htm)

上記のようなデータをマップの設定をせずにデータ連携すると、下記のように配列の列（`records`）が省略されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/37860a28-00ad-cbbd-4e0e-9409f6b5542d.png)

表形式でシンクする際には、Azure Data factory のドキュメントにて`階層構造のソースから表形式のシンクへ`の項にて紹介されている`コレクション参照`の設定を実施する必要があります。本記事では、`コレクション参照`を設定して Salesforce のデータを適切に取得する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/51f63d94-c596-e251-8717-2a92b29a9e88.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ed796b19-6a12-be75-a5f5-5ade136789d3.png)

引用元：[コピー アクティビティでのスキーマとデータ型のマッピング - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/copy-activity-schema-and-type-mapping#hierarchical-source-to-tabular-sink)

本記事では CSV などの表形式として連携する場合の設定手順を紹介しておりますが、 json 形式として書き込むことが許容できる場合には REST API の出力結果をそのまま保持させることがおすすめです。 json 形式で出力し、そのファイルを Spark などで処理することの方が開発生産性や保守性が向上することを期待できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a51690f-1320-c100-2a7f-f9863ba55538.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/97013fb0-5639-1585-cf32-8e4f6e92e108.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/53856a69-dfd7-265e-fc82-da5803b3619b.png)

## 事前準備

下記の作業を実施ます。

- Salesforce にて接続アプリを作成
- Azure Data Factory にて salesforce のリンクサービスを作成
- Azure Data Factory にて Salesforce REST API をソースとしてコピーアクティビティをもつパイプラインを作成

## 設定手順

### 1. コピーアクティビティのマップのタブにて、`スキーマのインポート`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/88fc16eb-ec8e-fc5b-2705-2a3842cdba90.png)

### 2. コレクション参照にて`records`を選び、再度、`スキーマのインポート`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2d6a500f-6274-706d-3fb4-6bf431810ad5.png)

### 3. `record`の`コレクション参照`にチェックがはいっていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a1cbc684-d27b-efdb-ea09-6fcff4446549.png)

### 4. すべてのカラムにて種類（データ型）を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c7a09fa6-bca1-2b62-c9f2-9e0d76de18ea.png)

### 5. パイプラインを実行し正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2fcc8253-ee05-9b4d-4b7c-004e302c023a.png)

### 6. 書きこまれたデータが想定であるかを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8bcfc7fe-7b61-84a0-b423-e18326e6c4cf.png)