SQL Server 2019 ビッグデータクラスターを AKS で使う - Spark ジョブでデータを取り込む

[前回](https://qiita.com/kenakamu/items/7a4d7fd5505b58ad48b9) はデータ仮想化を利用したデータのクエリや取り込みを試しました。今回は SQL Server 2019 ビッグデータクラスター (BDC) の特徴でもある Spark を利用してみます。

# Spark とは

[Spark](http://spark.apache.org/) は大量データを効率よく処理できるため、ビッグデータを扱うプロジェクトではよく利用されています。Azure でも [Azure Databricks](https://docs.microsoft.com/ja-jp/azure/azure-databricks/what-is-azure-databricks) や [Azure HDInsight](https://docs.microsoft.com/ja-jp/azure/hdinsight/spark/apache-spark-overview) などで Spark をサポートしてきましたが、SQL Server 2019 ビッグデータクラスターでも利用可能となりました。

この記事では [MSSQL Spark コネクタを使用して Spark から SQL Server に対する読み取りと書き込みを行う方法](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/spark-mssql-connector?view=sql-server-ver15) を深堀します。ドキュメントの手順は一部古いため、手順が異なります。フィードバックしないとなぁ。

## Azure Data Studio と Notebook

BDC へ接続して Spark ジョブを実行する方法はいくつかりますが、GUI でやりやすいため、Azure Data Studio と Notebook を使います。

Notebook はこれまでの SQL Server Management Studio のクエリ実行画面と異なり、クエリ(コード)と結果、またマークダウン形式での文章を保持できる仕組みです。詳細は今回使っている際に紹介しますが、コードを実行する機能だと思っておいてください。

# シナリオ

Spark の利用シナリオは多岐に渡りますが、基本はデータ処理を行う際に利用するため、データの読み込みと書き出しを行います。読み込み元や書き出し先はシナリオに合わせて自由に組み合わせできます。
![](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/media/spark-mssql-connector/mssql-spark-connector-diagram.png?view=sql-server-ver15)

## 事前準備

サンプルを実行するにあたり、いくつか準備をします。

1\. 今回 Notebook で実行する ipynb ファイルを 2 つダウンロード。

[mssql_spark_connector_user_creation.ipynb](https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_user_creation.ipynb)
[mssql_spark_connector_sparkr.ipynb](https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_sparkr.ipynb)

2\. データとして AdultCensusIncome.csv をダウンロード。
[AdultCensusIncome.csv](https://amldockerdatasets.azureedge.net/AdultCensusIncome.csv)

3\. ADS から BDC に接続し、HDFS 配下に spark_data フォルダを作成して、ファイルをアップロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bf09a34f-b3ac-3027-d866-15587c4f314f.png)

# データベース、ユーザーなどの作成

まずはデータを取り込むための準備を行います。実行は T-SQL で行いますが、Notebook 上で実行します。

1\. File | Open File より mssql_spark_connector_user_creation.ipynb を開き、[Attach To] から [Change Connection] を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2276d86c-f266-aecc-4a32-903f0d7eefe8.png)

2\. Notebook は複数のセルで構成されており、はじめのセルは説明が記載されている。ここに Notebook の中身が書かれているので一読。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/af07ebc4-2185-5bcc-5180-c175bba85029.png)

3\. 2つ目のセルの実行アイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/386cfd69-819b-bf80-1f3e-3f3cd371301a.png)

4\. 結果が表示される。データベースができていることも確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/830385c6-7046-04d4-7642-00060433545a.png)

5\. 2 つ目のセルも実行。ここではユーザーの作成および権限の付与を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/acfec938-40ca-8bdc-2da7-cd80e0e5d096.png)

6\. 3 つ目のセルを実行。ここでは外部データソースとして connector_ds を作成し、ダミー外部テーブルを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/1ce4cfc9-3271-38e5-257d-2fb40afeda2c.png)

7\. 最後のセルを実行。作成したユーザーに対してデータソースの権限を付与。

尚、Notebook は画面上部の [Run Cells] をクリックすると一括で実行も可能。

# Spark を使ってマスターインスタンスの読み書き

1 つ目のシナリオでは HDFS にアップロードした CSV を読みこみ、マスターインスタンスへ書き込みを行います。

1\. mssql_spark_connector.ipynb を開き、BDC に接続。初めの説明を一読。また今回 [Kernel] が [PySpark] であることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/745714da-4383-5e09-2339-7c5df8f4e504.png)

2\. まず csv の読込み。結果ペインに Spark ジョブの情報と結果が表示される。

- dataFile でデータソースを指定
- df 変数にデータを読み込み
- df.show(5) で初めの 5 件を表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c4e32277-1c12-a328-b66e-427c9a4131f2.png)

3\. ここから Part 1 の内容となる。df に読み込んだデータを SQL マスターに書き込み。

- df.write で jbdc 経由で書き出し
- overwrite モードを指定しているため、データは上書き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b9ba860f-a695-d1a3-eb31-f55e16456c88.png)

4\. 次のセルでは append モードで書き込み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e9331eb5-58fb-a0ab-3f4a-3c7849581e8e.png)

5\. 最後に Spark を使ったデータの読み取りを実行。

- spark.read で jbdc 経由で読み込み
- show で表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3be35913-2dbd-fd99-792b-c9785fe27698.png)

# Spark を使ったデータプールへの読み書き

2 つ目のシナリオは外部テーブルに対するデータの読み書きを行います。外部テーブルであるため、結果としてデータプールにデータが保存されます。

1\. まずは overwrite でデータの上書き。

- option として dataPoolDataSource を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d6d5073c-780e-6651-1a10-7908f3b31144.png)

2\. 残りのセルではデータの append と読み取りを実施。処理内容は同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7a4dfe03-e3ae-62ff-1331-34e3b2bfd7eb.png)

# 作成したデータをクエリ

クエリは Notebook 経由でもクエリエディター経由でも行えます。
[クエリエディター]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d64aecc9-d605-21e8-9ffb-0989da22b0d4.png)

[Notebook]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7c109c73-12b5-cf9c-6ebd-26bea59993f4.png)

# まとめ

SQL Server 2019 BDC は全てが T-SQL で出来るという観点でよく語られますが、実は Spark エンジニアにとっても、これまでのスキルセットで SQL Server が使えるという事が分かりました。これから Spark も勉強しようと思います。

[次の記事へ]()
[目次へ戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)