C# で Azure Databricks に ODBC 接続する方法

## はじめに

Azure Databricks ではクラスターや SQL Warehouse に対して **ODBC 接続**が可能です。
今回は **C#** を使用してクラスターに ODBC 接続する方法を説明します。
環境は Windows 10 、VSCode 1.87.0 となります。

## 手順

### 1. VSCode Extention のインストール

VSCode にて [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit)、[NuGet Package Manager](https://marketplace.visualstudio.com/items?itemName=jmrog.vscode-nuget-package-manager) をインストールします。

### 2. .NET SDK のインストール

以下のページにてダウンロードした .NET インストーラーを実行します。

https://dotnet.microsoft.com/ja-jp/download/dotnet

### 3. ODBC Driver のインストール

以下のページにてダウンロードした ODBC Driver インストーラーを実行します。

https://www.databricks.com/spark/odbc-drivers-archive#windows

### 4. ODBC パッケージのインストール

VSCode にて NuGet Package Manager を利用して `System.Data.Odbc` パッケージをインストールします。

### 5. テーブルの準備

Databricks ワークスペースにて、以下のコードをノートブックで実行してテーブルを作成します。

```sql
%sql
CREATE TABLE odbctest
(
    name string,
    age int,
    address string
)
```

```sql
%sql
insert into odbctest  values('hoge',50,'tokyo');
insert into odbctest  values('fuga',51,'osaka');
```


### 6. コード編集

以下のコマンドを実行して、新規プロジェクトを作成します。

```console
$ dotnet new console -o "SampleConsole"
```


自動作成された `Program.cs` を以下のように編集します。
変数 `table`、`host`、`httppath`、`pwd` の値は自分の環境に合わせて変更しましょう。

```c#
using System;
using System.Data;
using System.Data.Odbc;

string table = "hive_metastore.default.odbctest";
string selectSQL = $"select * from {table}";

string driver = "{Simba Spark ODBC Driver}";
string host = "adb-1234567890123456.78.azuredatabricks.net";
string httppath = "sql/protocolv1/o/1234567890123456/1234-567890-mi123456";
string pwd = "dapi12345678901234567890";
string connectionString = $"Driver={driver};Host={host};Port=443;HTTPPath={httppath};UID=token;PWD={pwd};SSL=1;ThriftTransport=2;transportMode=http;AuthMech=3;";

using (OdbcConnection conn = new OdbcConnection(connectionString))
{
    try
    {
        conn.Open();
        using (OdbcCommand command = conn.CreateCommand())
        {
            command.CommandText = selectSQL;
            using (OdbcDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    Console.WriteLine("{0}", reader.GetFieldType(0));
                    Console.WriteLine("{0}", reader.GetValue(0));
                }
            }
        }
    }
    catch (OdbcException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

```

なお、プロキシを経由する場合は接続文字列が以下のようになります。

```c#
string connectionString = $"Driver={driver};Host={host};Port=443;HTTPPath={httppath};UID=token;PWD={pwd};SSL=1;ThriftTransport=2;transportMode=http;AuthMech=3;ProxyHost=10.0.0.5;ProxyPort=3128;UseProxy=1;";
```

認証方式は Databricks トークンを利用しています。これは Databricks ワークスペースにて取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/a43af6cc-db3f-564b-4581-f2c49756b0f2.png)

ODBC 接続文字列は Databricks ワークスペースのクラスター画面で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/cbdbadfe-0ed1-c564-fccb-079e1ba4b5e1.png)


### 7. コード実行

以下のコマンドでコードを実行します。テーブルの値が取得できることを確認します。

```console
$ dotnet run
System.String
hoge
System.String
fuga
```

## おわりに

C# で Azure Databricks に ODBC 接続する方法を説明しました。
今回はコード内に認証情報を記載していますが、ODBC データ ソース アドミニストレーターを起動して DSN 設定を行うことでも認証は可能です。

## 参考

https://zenn.dev/midoliy/articles/9e3cff958ff89ba151de