Azure Synapse Dedicated SQL Pool Connector の利用方法

## はじめに

[Azure Synapse Dedicated SQL Pool Connector](https://learn.microsoft.com/en-us/azure/synapse-analytics/spark/synapse-spark-sql-pool-import-export) は Azure Synapse Analytics の Apache Spark Pool から Azure Synapse Dedicated SQL Pool (Azure Synapse 専用 SQL プール) のデータを操作するためのものです。
今回は Apache Spark Pool からこのコネクターを利用して Azure Synapse Dedicated SQL Pool に対する読み取り/書き込みを実施するための導入手順を説明します。

## 導入手順

### 1. Azure Synapse Dedicated SQL Pool の作成

Azure Synapse Dedicated SQL Pool は Synapse Studio にて下図の赤枠ボタンより作成できます。
![スクリーンショット 2023-09-02 17.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/b2289cfc-d85c-06f3-7290-5cd8252447ea.png)

なお、SQL Admin ユーザーのパスワードは Azure Portal にて変更できます。
![スクリーンショット 2023-09-02 18.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/00c47638-6fd0-e8d8-917e-327508d034a5.png)


### 2. テーブルの作成

Synapse Studio の SQL スクリプトにて、以下のクエリを実行しテーブルを作成しデータを投入します。

```sql
CREATE TABLE Employee (EmployeeName VARCHAR(50));
INSERT INTO Employee (EmployeeName) VALUES ('hoge');
SELECT * FROM Employee;
```

![スクリーンショット 2023-09-02 18.12.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/8e71541b-3ecd-37f9-1617-46534b333f1e.png)


### 3. データ ソースの作成

Synapse Studio の SQL スクリプトにて、以下のクエリを実行しデータ ソースを作成します。

データベースのマスターキーは手順 1 で説明した SQL Admin パスワードとは別物であり、ここでは任意の値を入力すればよいことになります。なお、該当のストレージ アカウントには IAM 設定で Synapse マネージド ID に対して`ストレージ BLOB 共同作成者`権限を付与していることを前提とします。

```sql
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<任意の値>';

CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = 'MANAGED IDENTITY';

CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH
  (LOCATION = 'abfss://<コンテナ名>@<ストレージアカウント名>.dfs.core.windows.net/<フォルダパス>',
   CREDENTIAL = AzureStorageCredential,
   TYPE = HADOOP);
```

![スクリーンショット 2023-09-02 18.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/a7c10138-d04f-92e0-fab2-bb54e44b9693.png)


### 4. コードの実行

ノートブックで以下のコードを実行して、データの**読み取り**ができることを確認します。

```python
import com.microsoft.spark.sqlanalytics
from com.microsoft.spark.sqlanalytics.Constants import Constants
from pyspark.sql.functions import col

dfToReadFromTable = (spark.read
                     .option(Constants.SERVER, "<SQLサーバー名>.sql.azuresynapse.net")
                     .option(Constants.USER, "<ユーザー名>")
                     .option(Constants.PASSWORD, "<パスワード>")
                     .option(Constants.DATA_SOURCE, "MyAzureStorage")
                     .synapsesql("<SQLデータベース名>.dbo.Employee")
                     .limit(10))

dfToReadFromTable.show()
```

![スクリーンショット 2023-09-02 20.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/2cb2f443-6501-12a6-3644-4700d3051bb8.png)


ノートブックで以下のコードを実行して、データの**書き込み**ができることを確認します。

```python
import com.microsoft.spark.sqlanalytics
from com.microsoft.spark.sqlanalytics.Constants import Constants
from pyspark.sql.types import StructType, StructField, StringType

data = {'EmployeeName': 'fuga'}

schema = StructType([
  StructField('EmployeeName', StringType(), True),
])

df = spark.createDataFrame(data=[data], schema=schema)

(df.write
 .option(Constants.SERVER, "<SQLサーバー名>.sql.azuresynapse.net")
 .option(Constants.USER, "<ユーザー名>")
 .option(Constants.PASSWORD, "<パスワード>")
 .option(Constants.DATA_SOURCE, "MyAzureStorage")
 .option(Constants.STAGING_STORAGE_ACCOUNT_KEY,"<ストレージアカウントキー>")
 .mode("overwrite")
 .synapsesql("<SQLデータベース名>.dbo.Employee"))
```

![スクリーンショット 2023-09-02 21.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/59713d47-5ceb-0e5b-f49e-867b2807afcd.png)


## おわりに

Azure Synapse Analytics にて Azure Synapse Dedicated SQL Pool Connector を利用して Apache Spark Pool から Azure Synapse Dedicated SQL Pool に対して読み取り/書き込みが実行できることを確認しました。
今回は基本認証を利用していますが、Azure AD 認証を利用することも可能です。

## 参考

https://learn.microsoft.com/en-us/azure/synapse-analytics/spark/synapse-spark-sql-pool-import-export