Delta Sharingによる共有データへのアクセス

[Access data shared with you using Delta Sharing \| Databricks on AWS](https://docs.databricks.com/delta-sharing/recipient.html) [2021/9/13時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Delta Sharing](https://delta.io/sharing)はセキュアなデータ共有のためのオープン標準です。「データプロバイダー」と呼ばれるDatabricksユーザーは、「データ受領者」と呼ばれるご自身の組織外の個人あるいはグループとデータを共有するために、Delta Sharingを活用することができます。コネクターの完全なリストと利用方法に関しては、[Delta Sharing](https://delta.io/sharing)のドキュメントを参照ください。本書では、Databricks、Apache Spark、pandasを用いて、どのようにデータ受領者がDelta Sharingで共有されたデータにアクセスするのかを説明します。

共有データはDatabricksによって直接提供されませんが、Databricks上で稼働するデータプロバイダーによって提供されます。

> **注意**
データ受領者としてデータプロバイダーの共有データにアクセスすることで、データ受領者は、データプロバイダーからデータ受領者に提供されたデータ共有にアクセスするための認証がなされ、(1)Databricksは当該データおよびデータ受領者によるデータ利用に背金んを持たないこと、(2)Databricksが、共有データに対するデータ受領者の操作、アクセスに関する情報(そのような情報を関連したクレディンシャル情報を用いてデータにアクセスする個人、企業を特定する情報を含む)を収集し、適切なデータプロバイダーに共有して良いことを認めることを意味します。

# クレデンシャルファイルのダウンロード

共有データへのアクセスを許可するために、データプロバイダーはデータ受領者がクレディンシャルファイルをダウンロードできるようにデータ受領者に対してアクティベーションのためのURLを送信します。本書では、共有データにアクセスするためにどのようにクレディンシャルファイルを使用するのかを説明します。

> **重要！**
クレディンシャルファイルは一度のみダウンロードできます。クレディンシャルファイルをダウンロード後に再度アクティベーションのためのURLにアクセスした際、**Download Credential File**ボタンは利用できません。

> - 組織外の誰であっても、受領したクレディンシャルファイルやアクティベーションURLを共有しないでください。
> - 使用前にアクティベーションリンクを紛失した場合には、データプロバイダーに連絡してください。

1. データプロバイダーによって共有されたアクティベーションリンクをクリックしてください。ブラウザにアクティベーションページが表示されます。
1. **Download Credential File**をクリックしてください。

セキュアな場所にクレディンシャルファイルを格納してください。組織内の別の方に共有したい場合には、パスワードマネージャを使用することをお勧めします。

# 共有データの読み込み

クレディンシャルファイルをダウンロードしたら、データプロバイダーのDatabricksアカウントの認証を受け、データプロバイダーが共有したデータを読み込むために、お使いのコードでクレディンシャルファイルを使用します。データプロバイダーがデータ共有を停止するまでアクセスは維持されます。ニアリアルタイムでデータの更新を参照することができます。共有データを読み込みコピーを作成することができますが、ソースデータを更新することはできません。

以下のセクションでは、Databricks、Apache Spark、pandasを用いて共有データにアクセスする方法を説明します。共有データにアクセスする際、トラブルに直面した際にはデータプロバイダーにコンタクトしてください。

> **注意**
特別な記載がない限り、サードパーティから提供されるパートナーインテグレーションにおいては、彼らの製品、サービスを使用するために、対応するプロバイダーにアカウントを所持している必要があります。Databricksにおいては、コンテンツを最新のものにするようにしていますが、パートナーインテグレーションページにおけるインテグレーション、内容の精度に対して完全な責任を持つものではありません。インテグレーションに関しては対応するプロバイダーにアクセスしてください。

## Databricksを使用する

ノートブックコマンドを用いてDatabricksワークスペースで共有されたデータにアクセスするステップを説明します。クレディンシャルファイルをDBFSに格納し、データプロバイダーのDatabricksアカウントに対する認証を受け、データプロバイダーによって共有されたデータにアクセスします。

この例では、独立して実行できる複数のセルを持つノートブックを作成します。同じセルにノートブックコマンドを追加し、順に実行することもできます。

1. テキストエディタでダウンロードしたクレディンシャルファイルを開きます。
1. ![](https://docs.databricks.com/_images/workspace-icon.png) **Workspace**をクリックします。
1. フォルダを右クリックし、**Create > Notebook**をクリックします。
    - 名前を入力します。
    - ノートブックのデフォルト言語をPythonに設定します。これはデフォルトです。
    - ノートブックにアタッチするクラスターを選択します。[Apache Spark connector](https://github.com/delta-io/delta-sharing#apache-spark-connector)ライブラリがインストールされたDatabricksランタイム8.4以上が稼働するクラスターを選択します。
    - **Create**をクリックします。 

    ノートブックエディタ上にノートブックが開きます。

1. 共有データにアクセスするためにPython、pandasを使うためには、[delta\-sharing Python connector](https://delta.io/connectors/)をインストールします。ノートブックエディタで以下のコマンドを貼り付けます。

    ```sh
%sh pip install delta-sharing
```

1. 右側にあるセルのアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)で、![](https://docs.databricks.com/_images/run-cell.png)をクリックし、**Run Cell**を選択するか、**shift+enter**を押します。

    インストールされていない場合、クラスターに`delta-sharing`のPythonライブラリがインストールされます。

1. ノートブックエディタで、![](https://docs.databricks.com/_images/down-caret.png)をクリックし、**Add Cell Below**を選択します。新規セルで、クレディンシャルファイルをDBFSのフォルダにアップロードする以下のコマンドを貼り付けます。以下のように変数を置換してください。
    - `<dbfs-path>`: クレディンシャルファイルを保存するフォルダ
    - `<credential-file-contents>`: クレディンシャルファイルの中身

    クレディンシャルファイルには3つのフィールド`shareCredentialsVersion`、`endpoint`、`bearerToken`を持つJSONが含まれています。


    ```scala:Scala
%scala
dbutils.fs.put("<dbfs-path>/config.share","""
<credential-file-contents>
""")
```

1. 右側にあるセルのアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)で、![](https://docs.databricks.com/_images/run-cell.png)をクリックし、**Run Cell**を選択するか、**shift+enter**を押します。

    クレディンシャルファイルがアップロードされたらこのセルを削除してください。ワークスペースの全ユーザーがこのクレディンシャルファイルをDBFSから読み込むことができ、DBFSのクレディンシャルファイルは全てのクラスター、SQLエンドポイントで利用できます。セルを削除するには右端のアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)の**x**をクリックします。

1. Pythonを用いて、共有されているテーブルの一覧を表示します。ノートブックエディタで、![](https://docs.databricks.com/_images/down-caret.png)をクリックし、**Add Cell Below**を選択します。
1. 新規セルに以下のコマンドを貼り付けます。`<dbfs-path>`を上のコマンドのパスで置換します。

    コードを実行すると、PythonはクラスターでDBFSからクレディンシャルファイルを読み込みます。DBFSはFUSEを用いて`/dbfs/`にマウントされています。

    ```py:Python
import delta_sharing
client = delta_sharing.SharingClient(f"/dbfs/<dbfs-path>/config.share")
client.list_all_tables()
    ```

1. 右側にあるセルのアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)で、![](https://docs.databricks.com/_images/run-cell.png)をクリックし、**Run Cell**を選択するか、**shift+enter**を押します。

    結果は、テーブルごとのメタデータを含むテーブルの配列となります。以下の例では2つのテーブルが表示されています。

    ```
Out[10]: [Table(name='example_table', share='example_share_0', schema='default'), Table(name='other_example_table', share='example_share_0', schema='default')]
```

    アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

1. Scalaを用いて共有テーブルに対するクエリーを実行します。ノートブックエディタで、![](https://docs.databricks.com/_images/down-caret.png)をクリックし、**Add Cell Below**を選択します。新規セルに以下のコマンドを貼り付けます。コードを実行すると、JVMを通じてDBFSからクレディンシャルファイルを読み込みます。

    以下の変数を置換してください。
    - `<profile_path>`: クレディンシャルファイルのDBFSパス。例えば、`/<dbfs-path>/config.share`
    - `<share_name>`: テーブルに対する`share=`の値
    - `<schema_name>`: テーブルに対する`schema=`の値
    - `<table_name>`: テーブルに対する`name=`の値

    ```scala:Scala
%scala
 spark.read.format("deltaSharing")
   .load(s"<profile_path>#<share_name>.<schema_name>.<table_name>");
   .load(s"<profile_path>#<share_name>.<schema_name>.<table_name>").limit(10);
```

1. 右側にあるセルのアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)で、![](https://docs.databricks.com/_images/run-cell.png)をクリックし、**Run Cell**を選択するか、**shift+enter**を押します。

    共有テーブルをロードする度に、ソースの最新のデータを参照することができます。

1. SQLを用いて共有データにクエリーをするためには、共有テーブルからワークスペース内のローカルテーブルを最初に作成し、ローカルテーブルに対してクエリーを実行する必要があります。ローカルテーブルにクエリーを実行数多m日に、共有データの現在の状態を参照することができます。

    ノートブックエディタで、![](https://docs.databricks.com/_images/down-caret.png)をクリックし、**Add Cell Below**を選択します。

    変数を以下の通り置換します。
    - `<local_table_name>`: ローカルテーブルの名称
    - `<profile_path>`: クレディンシャルファイルの場所
    - `<share_name>`: テーブルに対する`share=`の値
    - `<schema_name>`: テーブルに対する`schema=`の値
    - `<table_name>`: テーブルに対する`name=`の値

    ```sql:SQL
%sql
DROP TABLE IF EXISTS table_name;
CREATE TABLE <local_table_name> USING deltaSharing LOCATION "<profile_path>#<share_name>.<schema_name>.<table_name>";
SELECT * FROM <local_table_name>;
SELECT * FROM <local_table_name> LIMIT 10;
```

1. 右側にあるセルのアクションメニュー![](https://docs.databricks.com/_images/cell-actions.png)で、![](https://docs.databricks.com/_images/run-cell.png)をクリックし、**Run Cell**を選択するか、**shift+enter**を押します。

    コマンドを実行すると、共有データに対して直接クエリーが実行されます。テストとして、テーブルがクエリーされ最初の10行の結果が返却されます。

アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

## Databricks外に共有されたデータへのアクセス

Databricksをお使いで無い場合には、以下の手順で共有データにアクセスしてください。

### Apache Sparkを使用する 

Apache Spark 3.x以降で共有データにアクセスするには以下の手順を踏んでください。

1. 共有されているテーブルの一覧など共有データのメタデータにアクセスするためには、[delta\-sharing Python connector](https://delta.io/connectors/)をインストールします。

    ```bash:Bash
pip install delta-sharing
    ```

1. [Apache Spark connector](https://github.com/delta-io/delta-sharing#apache-spark-connector)をインストールします。
1. 共有されているテーブルの一覧を表示します。以下の例では、`<profile_path>`をクレディンシャルファイルのパスで置換してください。

    ```py:Python
 import delta_sharing
 client = delta_sharing.SharingClient(f"<profile_path>/config.share")
 client.list_all_tables()
    ```

    結果はテーブルの配列とテーブルごとのメタデータとなります。結果には以下の2つのテーブルが含まれます。

    ```
Out[10]: [Table(name='example_table', share='example_share_0', schema='default'), Table(name='other_example_table', share='example_share_0', schema='default')]
    ```

    アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

1. Pythonを用いてSparkで共有データにアクセスします。

    ```py:Python
delta_sharing.load_as_spark(f"<profile_path>#<share_name>.<schema_name>.<table_name>")
spark.read.format("deltaSharing")\
.load(s"<profile_path>#<share_name>.<schema_name>.<table_name>")
spark.read.format("deltaSharing")\
.load(s"<profile_path>#<share_name>.<schema_name>.<table_name>")\
.limit(10))
    ```

    変数を以下の通り置換します。
    - `<profile_path>`: クレディンシャルファイルの場所
    - `<share_name>`: テーブルに対する`share=`の値
    - `<schema_name>`: テーブルに対する`schema=`の値
    - `<table_name>`: テーブルに対する`name=`の値

1. Scalaを用いてSparkで共有データにアクセスします。

    ```py:Python
spark.read.format("deltaSharing")
.load(s"<profile_path>#<share_name>.<schema_name>.<table_name>")
spark.read.format("deltaSharing")
.load(s"<profile_path>#<share_name>.<schema_name>.<table_name>")
.limit(10))
    ```

    変数を以下の通り置換します。
    - `<profile_path>`: クレディンシャルファイルの場所
    - `<share_name>`: テーブルに対する`share=`の値
    - `<schema_name>`: テーブルに対する`schema=`の値
    - `<table_name>`: テーブルに対する`name=`の値

    アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

### pandasを使用する

pandas 0.25.3以上で共有するデータにアクセスするには、以下のステップを踏んでください。

1. 共有されているテーブルの一覧など共有データのメタデータにアクセスするためには、[delta\-sharing Python connector](https://delta.io/connectors/)をインストールします。

    ```bash:Bash
pip install delta-sharing
    ```

1. 共有されているテーブルの一覧を表示します。以下の例では、`<profile_path>`をクレディンシャルファイルのパスで置換してください。

    ```py:Python
 import delta_sharing
 client = delta_sharing.SharingClient(f"<profile_path>/config.share")
 client.list_all_tables()
    ```

    アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

1. Pythonを用いてpandasで共有データにアクセスします。以下の例では、変数を以下の通り置換してください。
    - `<profile_path>`: クレディンシャルファイルの場所
    - `<share_name>`: テーブルに対する`share=`の値
    - `<schema_name>`: テーブルに対する`schema=`の値
    - `<table_name>`: テーブルに対する`name=`の値
 
    ```py:Python
import delta_sharing
delta_sharing.load_as_pandas(f"<profile_path>#<share_name>.<schema_name>.<table_name>")
    ```

    アウトプットが空、あるいは期待するテーブルが含まれていない場合には、データプロバイダーに連絡してください。

# 次のステップ

- [Databricksについて理解を深める](https://docs.databricks.com/index.html)
- [Delta Sharingについて理解を深める](https://delta.io/sharing/)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)