Delta Sharingを使ってローカルPCからDatabricksのデータにアクセスしてみる


# はじめに

[前回の記事](https://qiita.com/maroon-db/items/0cc0f55501052f76da8d)でDatabricks間でDeltasharingを使ったデータ共有を行いましたが、今回はDatabricks以外の環境からアクセスしてみたいと思います。

DeltaSharingはオープソースプロジェクトですので、以下のようにDatabricks以外のツールからもアクセスすることが可能です。ただし現時点で対応しているツールは少ないのでご注意ください。対応状況については[こちら](https://delta.io/sharing/)をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/8af2f56c-a4e3-af87-c875-cbea1e146c7a.png)

# 準備

以下のセットアップが完了している必要があります。
- Unity Catalogが利用できる
- [DeltaSharingが有効になっている](https://docs.databricks.com/data-sharing/set-up.html)
- 共有するメタストアに対して管理権限を持っているもしくはメタストアに対して特権（CREATE_SHARE, CREATE_RECIPIENT, CREATE_PROVIDER)を持っている

詳細なDeltaSharing要件については[マニュアル](https://docs.databricks.com/data-sharing/set-up.html)もご覧ください。

# 1. DeltaSharing受信者の作成

データブリックスのデータエクスプローラーから、DeltaSharingメニューを開いて「自分が共有」ー「新たな受信者」をクリック。Databricks以外のツールからのアクセスのため、共有識別子の入力は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/0a16a7c7-56fa-6684-e63a-f684babb9d79.png)

# 2. アクティベーションリンク発行 ＆ クレデンシャル情報
アクティベーションリンクが発行されるのでクライアント側になんらかの方法で送信する。リンクは後から受信者の詳細ページで確認もできます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/ebbf1bf5-3ba9-295c-c26a-03ba93895363.png' width='600'>

リンク先を参照すると以下のようにクレデンシャル情報をダウンロード出来るようになっております。**（ダウンロードは一回のみ可能ですので要注意）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/9400c35e-a865-19c3-4edb-5e1054403be4.png)

ちなみに発行したトークンの有効期限を変更したり、IPアクセス制御をかけたりすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a46b3542-d237-f648-ee66-4b6c90171b3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/de68b2bf-4c65-49e0-0247-0fee6a1031b7.png)



# 3. 共有オブジェクトの作成

### 2-1. 共有するテーブルを指定し共有オブジェクトを作成します。

同じくデータエクスプローラ（共有する側）のDelta Sharingメニューから、「自分が共有」を選択し、右上にある「データを共有」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b0d46706-202c-1d41-d25a-cedcb467ce07.png' width='700'>

### 2-2. オブジェクトが作成できたら、次に共有するテーブルを追加してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f346e1ee-357f-6b54-d338-2679016013a8.png)

高度なテーブルオプションでは、エイリアス名をつけたり、共有するパーティションを指定したり、CDFとして共有するなど選択できます。

最後に保存する。

### 2-3. 作成した共有オブジェクトに受信者を追加

共有オブジェクト画面にて、右上に「受信者を追加」ボタンをクリックし、1で作成した受信者を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f96978da-f919-b7fc-c4a8-b7b9d062a7b2.png)

# 4. ローカルPCからアクセス

それでは準備は整いましたので、Delta Sharingを使ってデータブリックスのデータにアクセスしてみます。
今回はPandasとしてデータを取り込んでみます。

### 4-1. Credential Fileの保存

1でActivation LinkからダウンロードしたCredentialファイル(**config.share**)をローカルPCに保存します。

### 4-1. Pandasとしてデータを読み込む

まずはdelta-sharingモジュールをinstallします。

```python
%pip install delta-sharing
```

次に以下のようにpandasとして読み込みます。
- profile_path : 保存したCredentialファイルのパス
- share_name : 共有オブジェクト名（ステップ3で作成したもの）
- schema_name : テーブルが格納されているSchema(database)名
- table_name : 参照したいテーブル名

```python
import delta_sharing

profile_path = "./config.share" ## Credential File Path
share_name = "delta-nyctaxi" 
schema_name = "db1"
table_name = "nyctaxi"

df = delta_sharing.load_as_pandas(f"{profile_path}#{share_name}.{schema_name}.{table_name}")
df 
```

実際の画面はこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/5009cb40-6a16-b02c-6a93-7ae6d6ec93bb.png)

### その他クライアントツールについて

Pandas以外にも、Sparkや PowerBIからもアクセスできます。詳細はこちらをご覧ください。
https://docs.databricks.com/data-sharing/read-data-open.html#apache-spark-read-shared-data


# 嬉しい点
- シンプル：　ODBC/JDBCドライバーなど不要でクライアント側からは簡単に利用できる
- 柔軟性：　従来のようなPersonalトークン発行だと利用範囲が大きく、余計なテーブルなどにアクセス出来てしまったりしていたが、細かい範囲指定や柔軟なトークン管理が出来るため柔軟性が大きい
- 費用面：Provider(データ供給者)側はクラスターやSQL Warehouseを起動せずにアクセスできるため、コストを低く抑える事ができます。（Network通信費とストレージIO費程度）。