はじめてのDatabricks

:::note info
**ポッドキャスト**
NotebookLMに以下の記事の[ポッドキャスト](https://notebooklm.google.com/notebook/20d545a1-d627-450e-931f-8663255194c9/audio)を作ってもらいました。
:::


Databricks弥生です。今年もよろしくお願いします。Databricksに入社してからはや3年が経ち、これまでに入門書的な記事をいくつか書いてきています。

https://qiita.com/taka_yayoi/items/125231c126a602693610

https://qiita.com/taka_yayoi/items/4603091dd325c77d577f

クイックスタートガイドについては本も出しました。

https://www.amazon.co.jp/dp/B09V1YXFVQ?1

しかし、これらの内容が古くなってきているのもありますし、今更ながら「はじめてのDatabricks」の記事を書いていないことに気づきましたので書きます。

# 対象読者

- Databricksの環境(ワークスペース)が構築されている。ワークスペースがない場合には[無料トライアル](https://databricks.com/jp/try-databricks)に申し込んでください。
- Databricksワークスペースのユーザーが払い出されている。
- これからDatabricksを使い始めるが、どこから手をつけたらいいのか悩んでいる。

## お悩み事

これまでに以下のようなお悩み事を伺っているので、可能な限り解消していきたいと思います。

- Databricksとは何かがわからない、何ができるのかわからない
- Juypter NotebookやGoogle Colaboratoryと何が違うのかがわからない
- Databricksをどう使えばいいのかがわからない
    - 画面が英語でとっつきにくい
    - Databricksのメニュー項目が多すぎてどれがどれかがわからない
    - 不用意にデータやファイルを上書きしてしまわないかが怖い

# Databricksとは

以下にまとめていますが、すごくざっくり言えば**データやAIの活用というユースケースで必要となるさまざまな便利機能を搭載しているノートブック開発環境**です。ざっくりしすぎかもしれませんが、データサイエンティストやデータエンジニアの方が最初に触れるインタフェースはJupyter NotebookやGoogle Colaboratoryと同様のノートブックです。

https://qiita.com/taka_yayoi/items/91dde16b275c279ad2a2

# Juypter NotebookやGoogle Colaboratoryとの違い

## Jupyter Notebookとの違い

こちらにまとめています。

https://qiita.com/taka_yayoi/items/d5ea3dede05a180091b2

Databricksではビルトインのビジュアライゼーションの機能があるなど、細かいところを挙げると色々ありますが、大きな違いは**ラップトップで稼働させるのか**、**クラウドで稼働させるのか**だと思います。稼働する場所で何が違うのかというと:

|  | Jupyter Notebook | Databricks |
|:--|:--|:--|
| 計算リソース  | Juypter Notebookが稼働しているラップトップ、サーバーのリソースに制限を受けます。多くの場合、pandasの利用が前提となるのでメモリーの制約を受けます。  |  クラウドプロバイダー(AWS/Azure/GCP)が提供するリソースを理論上無制限に活用できます。pandasに加えて[Spark](https://www.databricks.com/jp/spark/about)も活用できるので、並列処理による恩恵を享受することができます。 |
| コラボレーション  | ラップトップで動作しているJupyter Notebookでの他のユーザーとのコラボレーションは限定的であり、[JupyterHub](https://jupyter.org/hub)を用いたとしてもその機能は限定的です。  | 複数ユーザーによるコラボレーションを前提としており、ノートブックやデータに対するアクセス制御やノートブックの同時参照、同時編集をサポートしています。  |
| ガバナンス  | ラップトップで動作しているJupyter Notebookでは、個人のデータサイエンティストによる管理しか行えず、企業全体でのデータやコード、機械学習モデルの管理を統一することができません。  | [MLOps](https://www.databricks.com/jp/glossary/mlops)を前提としており、データ、コード、機械学習モデルは全て[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)によって管理されます。  |
|本格運用(Production)|ラップトップ上で実験的にPythonを実行するには適してますが、本格運用するためにジョブを組むには別のシステムが必要となります。|Databricksには[ワークフロー](https://www.databricks.com/jp/product/workflows)の機能が搭載されているので、実験・テストを経たロジックを簡単に本格運用に移行することができます。また、[さまざまなAPI](https://docs.databricks.com/ja/workflows/jobs/jobs-2.0-api.html)を公開しているので、他のシステムとの連携も容易です。|

## Google Colaboratoryとの違い

Google Colaboratoryもクラウドで稼働するのでJuypter Notebookのリソースやコラボレーションの課題はある程度解消されますが、以下で詳細に比較が行われています。

https://datasciencenotebook.org/compare/colab/databricks

|  | Google Colaboratory | Databricks |
|:--|:--|:--|
|ホスティング|Googleがホスティングしているので、データをGoogleに渡すことになります。|自分のクラウドアカウントにホスティングするので、データをDatabricksに渡す必要はありません。([サーバレス](https://docs.databricks.com/ja/serverless-compute/index.html)を利用する際にはこの限りではありません)|
|データソース|Google Drive|Unity Catalogやご自身のクラウドアカウントのクラウドストレージ|

ガバナンスや本格運用などその他の違いに関してはJupyter Notebookと同様です。Google ColaboratoryではGPUを利用することができますが、あくまでGoogleが使用を許可しているスペックのみです。Databricksの場合はお客様が契約しているクラウドアカウントにおけるクォータの範囲内であれば、自由に計算資源を構成・利用することができます。

# Databricksの使い方

私は**全体像を大まかに理解してから、必要に応じて詳細に踏み込む**アプローチが好きです。最初から全てを理解しようとしていたら、いつまで経っても一歩を踏み出せません。

ということで、使い方のイメージをざっくり書いてみました。
![Screenshot 2024-01-07 at 18.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cfa48e30-f7cd-11d4-254a-d14ca2a0cef0.png)

ユーザーはデータサイエンティストやデータエンジニアです。それ以外の登場人物はこちらです。

- **ノートブック**: そのままです。Pythonなどでロジックを記述します。
- **計算資源**: Jupyter Notebookを利用している際にはあまり意識しないかもしれませんが、ラップトップであればラップトップのCPUやメモリーを使ってプログラムが実行されます。
- **データベース・ファイルシステム**: データを読み込んだり永続化するにはデータベースやファイルシステムが必要となります。 Jupyter NotebookであればローカルのファイルシステムやODBC/JDBC経由で接続したデータベースになるでしょう。

なので、Databricksを使うにしても、使い方にはJupyter Notebookと大きな違いはないと言えます(LLMなど複雑なことをやり始めるとこの限りではありませんが)。

とは言え、これではあまりにも抽象的なので、以下のステップを経てDatabricksでどういうことができるのかをウォークスルーしていきます。

1. Databricksワークスペースへのアクセス
1. ノートブックの作成
1. 計算資源の準備
1. データの読み込み
1. データの加工
1. データの保存

## Databricksワークスペースへのアクセス

Databricksの環境はお客様ごとに構築するので、[ワークスペース](https://qiita.com/taka_yayoi/items/a2fffa48fdf3f56dc00e)と呼ばれる作業環境のURLもお客様固有のものとなります。環境構築をされた方にURLを確認してください。

初回アクセスの際、画面がすべて英語で面食らうかもしれません。ブラウザの言語設定が日本語になっていれば、右上に言語設定のダイアログが表示されます。**日本語を使う**をクリックしてください。
![Screenshot 2024-01-07 at 20.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/62025150-3fa1-f2fc-1cac-c93f22b6cba3.png)

GUIが日本語に切り替わります。
![Screenshot 2024-01-07 at 20.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/59d2f99e-ed78-70e1-e77f-1055833f7b01.png)

ダイアログが表示されない場合には、以下の手順に従ってください。

1. 画面右上のメールアドレスをクリックして、**User Settings**をクリック。
![Screenshot 2024-01-07 at 20.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/032beaa2-b645-25fc-767e-1c3ca21fb135.png)
1. Userの下にある**Preference**をクリック。
![Screenshot 2024-01-07 at 20.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/179768d3-ca71-fd8d-9d4d-eb71b9d72e37.png)
1. **Language**から**日本語**を選択。
![Screenshot 2024-01-07 at 20.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9a93933f-0034-81dc-f85e-59213796d954.png)

以下のような画面が表示されるはずです。
![Screenshot 2024-01-07 at 20.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cabba29e-0c90-8519-cde0-32d3221fe970.png)

まずは、画面構成に慣れましょう。これもざっくり。
![Screenshot 2024-01-07 at 20.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/df446e36-304e-1f5b-9d2d-19187d248c43.png)

まず慣れる必要があるのは、画面左にある**サイドメニュー**です。Databricksの主要機能にアクセスする際に使用することになります。サイドメニュー上にカーソルを移動するとメニューが展開されます。
![Screenshot 2024-01-07 at 20.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/87d9a217-77e1-921a-dbf2-c9078f836ef2.png)

ここでも最初から全てを理解するのではなく、以下の項目にフォーカスします。他の機能は必要になったら勉強すればいいのです。

- **新規:** Databricksにおけるさまざまなアセット(資産)を作成するときに使います。ノートブックやクラスターなど色々なアセットを作成できます。
- **ワークスペース:** アセットはフォルダで整理することができます。このフォルダ階層にアクセスするために使うメニュー項目がワークスペースです。
- **カタログ:** Databricksにビルトインされているデータベースのようなものです。テーブルだけでなくファイルや機械学習モデルなども格納することができます。
- **クラスター:** Databricksにおける計算資源です。ノートブックの編集では計算資源は不要ですが、プログラムを実行する際にはクラスターは必須となります。

## ノートブックの作成

![Screenshot 2024-01-07 at 21.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1175a94d-7e38-c493-bc15-08fd158dbc97.png)


Databricksでもプログラムを実行するにはノートブックを作成する必要があります([IDE連携](https://qiita.com/taka_yayoi/items/08f3a170827ab8df56bd)をするなどすればPythonファイルを実行することもできます)。ノートブックを作成する前に、Databricksワークスペースのフォルダ階層を理解しましょう。

[上述](#jupyter-notebookとの違い)したようにDatabricksの環境は複数ユーザーによるコラボレーションを前提としています。このため、以下のフォルダがデフォルトで作成されます。

- ホームフォルダ: 各ユーザーごとのホームフォルダ。自分のアセットはデフォルトでホームフォルダ配下に作成されます。[アクセス権を付与](https://docs.databricks.com/ja/security/auth-authz/access-control/workspace-acl.html)しない限り、他のユーザーがあなたのアセットにアクセスすることはできません。しかし、管理ユーザーはこの限りではありません。
![Screenshot 2024-01-07 at 20.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8230bca5-9adb-5b9d-f0b5-7e1b95ed0c09.png)
- Workspace: ワークスペースに登録されたユーザーそれぞれのホームフォルダを格納します。
![Screenshot 2024-01-07 at 20.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3e198fbd-9f44-75cf-765b-3a1f2438a66a.png)
- Shared: すべてのユーザーが読み書きできるフォルダです。ノートブックの共有などの目的で使用します。
- お気に入り: ノートブックやフォルダをお気に入りに登録するとこちらに表示されます。ショートカットできます。
- ゴミ箱: 削除されたノートブックなどは一定期間こちらに格納されます。元に戻すこともできます。

自分のアセットはホームフォルダ配下、削除されたアセットはゴミ箱をまず覚えておくと良いかと思います。

ホームフォルダ直下にノートブックを作成しても構いませんが、整理できるように私は作業内容ごとにフォルダを作成しています。ワークスペースを表示している状態で右上の**追加**をクリックします。
![Screenshot 2024-01-07 at 20.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cadd21a7-a752-bd26-e94f-b7f5d9956347.png)

**フォルダ**を選択します。
![Screenshot 2024-01-07 at 20.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f1f66e34-55f8-a0c3-362f-5eb517ab6865.png)

フォルダ名を記入します。
![Screenshot 2024-01-07 at 20.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4b3d6f7b-9321-1703-47db-40093c2c816e.png)
![Screenshot 2024-01-07 at 20.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e94a6779-3f96-771f-8d45-e80483f7cdff.png)

ノートブックを作成する手段はいくつかありますが、上と同じように**追加 > ノートブック**を選択します。
![Screenshot 2024-01-07 at 20.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7f63cd13-8b72-a38c-e127-daac954d0a2e.png)

これでノートブックを作成できました。
![Screenshot 2024-01-07 at 21.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d484302b-c3a8-6987-2aaa-72ec3d718ac5.png)

ここで、ノートブックの画面にも慣れておきましょう。ノートブックのインタフェース自体はJupyterやColaboratoryと大きな違いはないと思います。
![Screenshot 2024-01-07 at 21.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/320d6094-29ee-45f3-58d9-1244e730282c.png)

ノートブック名はクリックで編集できます。
![Screenshot 2024-01-07 at 21.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d219fe31-e90f-3ce3-0596-16ec5162367a.png)

今回、便利メニューの説明は割愛します。目次の表示、[ワークスペースフォルダへのアクセス](https://qiita.com/taka_yayoi/items/f85b50c7f4f8893ec4d0)、[Unity Catalogメタストアへのアクセス](https://qiita.com/taka_yayoi/items/1a4f647d4f3817ce2729)、[AIアシスタント](https://qiita.com/taka_yayoi/items/855e15def68150bdea55)、ノートブックコメント、機械学習モデルのトラッキング、バージョン履歴、[変数エクスプローラ](https://qiita.com/taka_yayoi/items/b38fb466aeb0d23b805b)、[ライブラリエクスプローラ](https://qiita.com/taka_yayoi/items/dda461ba658df9689e97)などを利用できます。

今回重要になるのはノートブック本体とクラスターセレクターです。ノートブックにプログラムを記述するのは当たり前ですが、Databricksの計算資源である**クラスター**が必要となります。

## 計算資源の準備

![Screenshot 2024-01-07 at 21.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fc5819ed-c258-c4d0-18ca-24a3ac7ba0b9.png)

[Databricksクラスター](https://qiita.com/taka_yayoi/items/c5d99cd77fe4bfcf69f0)はクラウドプロバイダーの提供する仮想マシン(EC2/VMなど)をカプセル化して、さまざまな要件の処理に柔軟に対応できる機能を提供します。以下のような機能を提供します。

- プレインストールされるソフトウェア(Python/Sparkの実行環境、scikit-learn/tensorflowなど)
- ライブラリの追加インストール
- オートスケーリング(クラスターの実態は複数台の仮想マシンです。クラスターの由来はここにあります。処理の負荷などに応じて自動でマシン数を増減させます)
- 自動停止(クラウドで一番お金がかかるのは計算資源です。使われていない計算資源はコスト的に一番の無駄です)

ということで、クラスターを作成しましょう。サイドメニューの**クラスター**をクリックします。
![Screenshot 2024-01-07 at 21.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afe044af-d238-ddca-bf39-b881b3c76743.png)

すでに作成済みのクラスターがあれば一覧に表示されます。なお、上の画像ではすべてのクラスターの状態は停止状態です。この状態ではお金は全くかかっていません。Databricksもクラウドプロバイダーも計算資源の費用は**稼働している状態**にのみ発生します。Databricksにおける計算資源、クラスターの考え方としては**揮発性(ephemerarl)** というものがあります。これは、処理が必要なときだけ計算資源をかき集めてクラスターを構成して、処理が終わったら解放するという使い方に立脚しています。ラップトップやオンプレミスのサーバーは**所有している計算資源=活用できる計算資源**となりますが、クラウドリソースを活用する際にはその制限を気にする必要はありません。処理対象のデータ構造、データ量、処理内容に応じて計算資源を充当できるのがクラウドを活用することの大きなメリットと言えます(コストも考慮する必要はありますが)。ここで作成するクラスターというのは計算資源のメタデータであって、そのメタデータに従って計算資源が構成されるという考え方になります。言い方はあれですが「使い捨て」の計算資源となります。

右上の**コンピューティングを作成**でクラスターを作成できるのですが、クイックに最小規模のクラスターを作成するにはその左にある**Personal Computeで作成**をクリックします。[パーソナルコンピュート](https://qiita.com/taka_yayoi/items/0234a88ec5a73afb0fb4)とはクイックにクラスターを作成できるテンプレートのようなものです。Databricksクラスターは詳細な設定を含めると、台数だけではなくインスタンスタイプ、initスクリプト、ソフトウェアバージョンなどなど多様な設定が可能です。それらを毎回選択するのは手間なので、クイックに作業に取り掛かれるようにするためのパーソナルコンピュートが用意されています。なお、以下のスペックとなります。

- シングルノードのクラスター
- 最新の[Databricks機械学習ランタイム](https://www.databricks.com/jp/product/machine-learning-runtime)をインストール

これをクリックするとデフォルト設定が行われた状態でクラスター作成画面が表示されます。**コンピューティングを作成**をクリックすることでクラスターが作成されます。
![Screenshot 2024-01-07 at 21.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5a8dc569-189b-ea06-ab78-6a93171a5ba4.png)

仮想マシンの取得、ソフトウェアのインストールが行われるので5分ほどお待ちください。クラスター名の右にインジケータが表示されます。
![Screenshot 2024-01-07 at 21.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6912e118-2b44-bb73-0273-a64ae51d1d69.png)

起動すると以下のような画面になります。
![Screenshot 2024-01-07 at 21.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/638c5782-d161-b016-e748-ab09d9509073.png)

しかし、これで終わりではありません。このクラスターは起動しているだけであり、[上で作成したノートブック](#ノートブックの作成)の処理をこのクラスターで実行するという指示を行う必要があります。そのためにはノートブックの画面に戻る必要があります。サイドメニューの**ワークスペース**にアクセスして、作成したフォルダ、ノートブックにアクセスします。
![Screenshot 2024-01-07 at 21.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b3da758d-545f-e86e-2dc1-c885d4b53ca3.png)

そして、右上のクラスターセレクターをクリックします。
![Screenshot 2024-01-07 at 21.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/69cd651d-e6b4-19e1-7270-c8a1b5c432ee.png)
起動しているクラスターが一覧に表示されるはずです。クラスターを選択します。
![Screenshot 2024-01-07 at 21.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17308c58-cd96-526f-0822-a2645e0de1dc.png)

これでプログラムを実行できるようになりました。
![Screenshot 2024-01-07 at 21.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a1c8e1f4-fbf1-a080-83f3-19cd5a3d3b1e.png)

お約束のプログラムを実行しましょう。セルに以下を記述します。

```py:Python
print("Hello Databricks!")
```
![Screenshot 2024-01-07 at 21.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/37966177-48e8-8acd-9762-f2a406274410.png)

セルの右上にある▶️をクリックし、**セルを実行**をクリックします。
![Screenshot 2024-01-07 at 21.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2e3c00fc-41fc-cd3e-2ab5-5869f0684675.png)

動きました！
![Screenshot 2024-01-07 at 21.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f7ec3f32-4274-6d9f-80c7-aedd549d1ded.png)

:::note
**注意**
エラーが出る場合には、ノートブック名の右にある言語がPythonであるかどうかを確認してください。
![Screenshot 2024-01-07 at 21.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e30137f9-ca99-0d8f-0504-cdb8b51a3abc.png)
:::

## データの読み込み

![Screenshot 2024-01-07 at 21.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6e4b33e5-79ae-aae5-1b75-c71dea7c81d0.png)

これでDatabricksでプログラムを実行できるようになりました。早速データを処理していきましょう。ノートブックにセルを追加するには、ノートブックの上か下の端にカーソルを移動します。**+** ボタンが表示されるのでこれをクリックします。
![Screenshot 2024-01-07 at 21.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7d6f5ce1-c873-f549-9342-bab6c201c5ff.png)
![Screenshot 2024-01-07 at 21.46.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a2a70ce-146b-06b7-8e95-80ca7a0a6edf.png)

Databricksにおいてデータやファイル、機械学習モデルを管理するためのソリューションは[Unity Catalog](https://qiita.com/taka_yayoi/items/b92d783485ce267462d0)です。名前の通り、カタログソリューションであり上述のアセットのアクセス管理、監査ログ、依存関係などをまるっと面倒見てくれます。色々な機能を提供しますが、ここではデータの読み書きにフォーカスします。

Unity Catalogにはすぐに利用できるサンプルデータが格納されているので、ここではそれを使います。Unity Catalogで管理されているデータをクイックに確認するには**カタログエクスプローラ**が便利です。サイドメニューの**カタログ**をクリックします。スキーマやデータを簡単に確認できます。
![Screenshot 2024-01-08 at 8.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4ac0be3d-7028-78c3-7865-aa459943cdeb.png)
![Screenshot 2024-01-08 at 8.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/759fdabc-d4fa-670c-2682-db70930bcd70.png)

ノートブックに戻ります。ここでのノートブックはPythonなので、Pythonで処理するのが素直だと思うのですが、データベースの処理をするならSQLの方がわかりやすいので、**PythonノートブックでSQLを使います**。これもDatabricksの提供する柔軟性の一つです。セルの先頭にマジックコマンド`%sql`を追加することでそのセルの言語をSQLに切り替えることができます。他の言語(R、SQL、Python)も同様です。

```sql:SQL
%sql
select * from samples.tpch.orders limit 1000;
```
![Screenshot 2024-01-07 at 21.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/85f4e521-44f3-b0bd-04a3-87b83beb7858.png)

テーブル名を`samples.tpch.orders`と指定していることに注意してください。Unity Catalogで管理されるテーブルは**3階層の名前空間**で管理されます。`<カタログ>.<スキーマ(データベース)>.<テーブル>`で個々のテーブルを特定します。テーブルだろうがファイルだろうが、データを読み書きする際には、**どのデータを対象に処理をしているのかを意識する**ことが重要です。テーブルなら上記の名前空間、ファイルならパスとなります。よくある間違いの一つは**意図しないテーブルやパスのファイルを読み込んだり、書き込んだりしていた**だと思います。

読み込み処理はこれで終わりではありません。上のスクリーンショットには**テーブル**の右に **+** が表示されてます。これをクリックします。可視化を選択します。
![Screenshot 2024-01-07 at 22.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5a5635ff-2268-2e85-3f61-f8f4f302bfc9.png)

[こちらの手順](https://docs.databricks.com/ja/visualizations/visualization-types.html#area-chart)に従ってビジュアライゼーションの設定を行います。
![Screenshot 2024-01-07 at 22.07.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e1fff8d1-52d7-6838-6fb4-d90a27116fa3.png)

これでノートブックにグラフを追加することができました。Jupyterなどであればmatplotlibやseabornで可視化のロジックを記述しないとグラフにすることができませんが、Databricksならこの辺りはお手軽にできます。もちろん、matplotlibやseabornも使えます。
![Screenshot 2024-01-07 at 22.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/524b2627-9b30-9442-ac14-2a05c15eb696.png)

## データの加工

こちらでも書いていますが、どのような変換を行いたいのかに応じて処理を実装することになります。

https://qiita.com/taka_yayoi/items/51bd9a1a895109ec1625

ここではすでに別の方(データエンジニアなど)によってデータが準備されていることを前提にします。自分でデータを準備する場合にはこちらをご一読ください。

https://qiita.com/taka_yayoi/items/08aeeac8f63a2f8158eb

例えば、対象データの特定の列と特定の行に限定したいというフィルタリング処理を行ってみます。行の絞り込みでは`o_orderdate`と`o_totalprice`にフィルタリング条件を適用しています。

```sql:SQL
%sql
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000
```
![Screenshot 2024-01-08 at 8.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5557b8b3-201e-7466-4878-ea8e64bc7dfc.png)

このように、どのような形状のデータが必要なのかという要件に応じてデータを加工することになります。

## データの書き込み

[上述](#データの読み込み)したように、**どこに書き込みを行うのか**を意識することが重要です。特に書き込みの際には対象データを上書きしてしまう可能性があるので注意してください。当たり前の話ですが、どんなに仕組みが洗練されたとしても既存データに対して書き込み権限があるのであれば、データの上書きは可能です。

:::note
**注意**
管理者の方向けの話となりますが、誤った操作でデータを上書きしてしまうというのは日常的に起こる事故といえます。このような事故を避けるためにも[環境の分離](https://qiita.com/taka_yayoi/items/f2aedc25516c43767f7f)(開発用/本番用)や適切な[アクセス権の設定](https://qiita.com/taka_yayoi/items/b34b89d8e158935c3095)を行うことをご検討ください。なお、Databricksにおけるデフォルトのテーブル形式である[Delta Lake](https://www.databricks.com/jp/product/delta-lake-on-databricks)ではテーブルの更新ログが自動で記録されますので、テーブル状態のロールバックは可能です。
:::

### テーブルへの書き込み

加工したデータを自分用のカタログ、スキーマ(データベース)配下のテーブルとして保存するのがよくある使い方でしょう。ここでは、自分用のカタログ`takaakiyayoi_catalog`、スキーマ`tpch`が作成されており、権限が付与されているものとします。カタログの作成権限があるかどうか、自分が使えるカタログがあるのかについては管理者の方に確認してください。
![Screenshot 2024-01-08 at 8.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/548dba46-62d0-7f5d-9bb5-2b30e59b0353.png)

ここがテーブルの書き込み先となります。一旦SQLでやり切るのでいわゆるCTAS(Create Table As Select)構文を使います。作成するテーブル名は上述のカタログとスキーマを使うので`takaakiyayoi_catalog.tpch.orders_199807`とします。

```sql:SQL
%sql
CREATE TABLE takaakiyayoi_catalog.tpch.orders_199807 AS
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000
```

エラーが出なければ問題なくテーブルを書き込めています。
![Screenshot 2024-01-08 at 8.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7e3690c0-2a79-b325-75d7-071c6de713f9.png)

カタログエクスプローラにアクセスすると、作成されたテーブルを確認できます。
![Screenshot 2024-01-08 at 8.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b6e9fb7f-6733-36d2-e10f-9227fc91e9e5.png)
![Screenshot 2024-01-08 at 8.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2dccd6aa-c836-b8f0-4ba9-e513246da7d5.png)

これでデータを永続化することができました。もう一つ重要な観点が**権限**です。デフォルトではテーブルの作成者(あなた)のみがこのテーブルにアクセスできます。このデータを他のユーザーと共有したい場合には、権限を付与することで他のユーザーの方も活用できるようになります。このような機能もデータによるコラボレーションを促進するためのものです。
![Screenshot 2024-01-08 at 8.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/771670e0-3eb4-3d09-f280-50af4870cc8f.png)
![Screenshot 2024-01-08 at 9.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ee219a3e-35ff-e364-8840-59a8edbe2851.png)

ずっとSQLで処理を記述してきましたが、Pythonでも同様のことは可能です。ここまでSparkの話はしてきていませんでしたが、Databricksの処理の肝になっているのが[Apache Spark](https://www.databricks.com/jp/spark/about)です。大量データの処理を効率的に行うための分散処理フレームワークです。ここでは詳細に踏み込みませんが、これもざっくりいうと**ペタバイトであろうがエクサバイトのデータであろうが、マシン台数を増やして並列に高速に処理できる**仕組みです。この処理には、上で行ったようなデータの加工や機械学習モデルのトレーニングなどさまざまなものが含まれます。そして、Sparkの長所の一つに**さまざまな言語のサポート**があります。上でSQLを実行していましたが、これはSparkによって処理されています。それ以外にもPython、R、Scalaもサポートしています。Pythonを使う際にはSparkに対するPython APIである[PySpark](https://www.databricks.com/jp/glossary/pyspark)を使います。

プログラムとしてロジックを記述するのであれば、SQLよりもPythonがおすすめとなります。ループや条件分岐をSQLで記述するのは相当難易度高いです。

ただ、「PySparkは敷居が高い」という声も伺います。しかし、pandasやRを使いこなしている方であれば、PySparkは方言の一つと言えるのではないかと個人的には思いますし、パフォーマンス最適化などの話が出てくると細かい設定が必要となりますので、早い段階でPySparkに慣れていただくのが良いかと思います。「PySparkをマスターするぜ」という気概のある方はこのあたりからいかがでしょうか。

https://qiita.com/taka_yayoi/items/a7ee6287031374efa88a

https://qiita.com/motokazu_ishikawa/items/c55c55426d24edb43a36

あと、SparkでPandas APIを実行する手段もあります。

https://qiita.com/taka_yayoi/items/43bd3935f77828c4e33e

なお、上のSQLのロジックをPySparkで実装すると以下のようになります。

```py:Python
sdf = spark.table("samples.tpch.orders")
(
    sdf.select(
        [
            "o_orderkey",
            "o_custkey",
            "o_orderstatus",
            "o_totalprice",
            "o_orderdate",
            "o_orderpriority",
        ]
    )
    .filter("o_orderdate = '1998-07-01' AND o_totalprice >= 100000")
    .write.saveAsTable("takaakiyayoi_catalog.tpch.orders_199807")
)
```

このように、データフレームを保存するのであればテーブルとして保存するのがおすすめです。カタログエクスプローラで容易にメタデータを確認できますし、他のユーザーへの共有も楽です。

### ボリュームへの書き込み

ファイルとして保存したい場合には、[ボリューム](https://qiita.com/taka_yayoi/items/453026daacf71ba5662f)を活用ください。Unity Catalogで管理されるファイルシステムのマウントポイントです。ボリュームでもUnity Catalogの名前空間の考え方は踏襲されています。パスは`/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data`のように`/Volumes/<カタログ>/<スキーマ>/<ボリューム>`となります。pandas/PySpark/シェルコマンドなど使うツールに関係なくこれらのファイルにアクセスできます。
![Screenshot 2024-01-08 at 9.23.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/498be3d9-d9c9-68f6-3f5d-67ddf0ac835f.png)

以下のようにpandasで読み込めます。

```py:Python
import pandas as pd

covid_pdf = pd.read_csv(
    "/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv"
)
display(covid_pdf)
```
![Screenshot 2024-01-08 at 9.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6a375bf-5068-6371-8d56-32222e8adc37.png)

ちなみに上の[display](https://docs.databricks.com/ja/visualizations/index.html)関数はDatabricksで使える便利コマンドで、データフレームを表示する際にお使いください。[上述の可視化機能](#データの読み込み)も利用できます。

PySparkでも読み込めます。

```py:Python
covid_df = spark.read.csv(
    "/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv",
    header=True,
)
display(covid_df)
```

![Screenshot 2024-01-08 at 9.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/975a43db-714d-cb80-76ef-11254ee6f03c.png)

シェルコマンドでもアクセスできます。シェルコマンドを実行するにはマジックコマンド`%sh`を使います。

```sh
%sh
head /Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/newly_confirmed_cases_daily.csv
```
```
Date,ALL,Hokkaido,Aomori,Iwate,Miyagi,Akita,Yamagata,Fukushima,Ibaraki,Tochigi,Gunma,Saitama,Chiba,Tokyo,Kanagawa,Niigata,Toyama,Ishikawa,Fukui,Yamanashi,Nagano,Gifu,Shizuoka,Aichi,Mie,Shiga,Kyoto,Osaka,Hyogo,Nara,Wakayama,Tottori,Shimane,Okayama,Hiroshima,Yamaguchi,Tokushima,Kagawa,Ehime,Kochi,Fukuoka,Saga,Nagasaki,Kumamoto,Oita,Miyazaki,Kagoshima,Okinawa
2020/1/16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2020/1/24,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
```

pandasデータフレームをCSVとしてボリュームに保存します。

```py:Python
covid_pdf.to_csv("/Volumes/takaakiyayoi_catalog/japan_covid_analysis/covid_data/pandas_data.csv")
```

保存されました。
![Screenshot 2024-01-08 at 9.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c678aab-506c-d882-b205-ed86ff5fdd09.png)

### 上書きの回避策

最後にもう一度上書きの件ですが、Sparkの場合には防御機構があります。例えば、テーブルを再度作成しようとすると以下のようにエラーとなりテーブルは上書きされません。すでにテーブルが存在しているというメッセージです。

> TableAlreadyExistsException: [TABLE_OR_VIEW_ALREADY_EXISTS] Cannot create table or view `tpch`.`orders_199807` because it already exists.

このような場合、**明示的に**上書きを指示することができます。`CREATE OR REPLACE TABLE`を使います。テーブルが存在する場合にはデータを洗い替えするコマンドです。

```sql:SQL
%sql
CREATE OR REPLACE TABLE takaakiyayoi_catalog.tpch.orders_199807 AS
SELECT
  o_orderkey,
  o_custkey,
  o_orderstatus,
  o_totalprice,
  o_orderdate,
  o_orderpriority
FROM
  samples.tpch.orders
WHERE
  o_orderdate = "1998-07-01"
  AND o_totalprice >= 100000
```

PySparkでも同様です。テーブルが存在する場合にはSQLの際と同じエラーとなります。明示的に上書きを指示するには、`write`の後に`mode("overwrite")`を指定します。

```py:Python
sdf = spark.table("samples.tpch.orders")
(
    sdf.select(
        [
            "o_orderkey",
            "o_custkey",
            "o_orderstatus",
            "o_totalprice",
            "o_orderdate",
            "o_orderpriority",
        ]
    )
    .filter("o_orderdate = '1998-07-01' AND o_totalprice >= 100000")
    .write.mode("overwrite").saveAsTable("takaakiyayoi_catalog.tpch.orders_199807")
)
```

ですので、通常Sparkを使ってデータを書き込む際に上書きを心配する必要はないのですが、最悪のパターンは**明示的に上書きを指定していることを忘れて上書きしてしまった**というものです。これは、[上述](#データの書き込み)の**どこに書き込みを行うのか**に加えて、**どのAPIのどの書き込みモードを使っているのか**についても注意を払う以外に対策はありません。逆にこれらを意識しないでプログラムを実行しているのであれば、それによるリスクを想像していただき注意深くコーディングすることをお勧めします。と言っている私もたまにやってしまいます。

# まとめ

書き込みのセクションは注意すべきことが多いので量が増えてしまいましたが、以下を注意いただきつつDatabricksを活用いただけると幸いです。

- データの読み書きはテーブルがお勧めです。アクセスが容易で上書きしたとしてもロールバックが簡単です。
- どのテーブル、ファイルを読み込んでいるのかを常に意識ください。
- どのテーブル、ファイルに書き込みを行うのかを常に意識ください。
- どのAPIのどの書き込みモードを使っているのか。明示的に上書きを指定している場合、それは適切なものであるのかをご確認ください。

そして、「これだとJupyter Notebookと大差ないのでは？」と思われた方もいらっしゃるかもしれませんが、これは「はじめてのDatabricks」です。ここでご紹介したのはDatabricksのほんの一部の機能です。

[こちら](https://docs.databricks.com/ja/introduction/index.html#what-is-databricks-used-for)に説明があるように、Databricksは以下のような用途でご活用いただけます。

- データ処理ワークフローのスケジューリングと管理
- ダッシュボードとビジュアライゼーションの生成
- セキュリティー、ガバナンス、高可用性、およびディザスタリカバリーの管理
- データの検出、アノテーション、探索
- 機械学習 (ML) のモデリング、追跡、モデルサービング
- 生成AI ソリューション

本書ではビジュアライゼーションとガバナンスの一部に触れたに過ぎません。それ以外の機能についても今後紹介してこうと思いますし、これまでに記述した記事は[こちら](https://qiita.com/taka_yayoi/items/c6907e2b861cb1070f4d)にありますので、ご興味のある方は一覧いただけると幸いです。

最後になりますが、クラスターが起動している間課金が発生しますので、使い終わったクラスターは停止しましょう。
![Screenshot 2024-01-08 at 10.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a325a638-8bf6-be16-80ae-b207f7b37575.png)

# 参考資料

- [Databricksとは｜Databricks on AWS](https://docs.databricks.com/ja/introduction/index.html)
- [Databricksノートブック入門 \| Databricks on AWS](https://docs.databricks.com/ja/notebooks/index.html)
- [コンピュート \| Databricks on AWS](https://docs.databricks.com/ja/compute/index.html)
- [Databricks での探索的データ分析 : ツールとテクニック \| Databricks on AWS](https://docs.databricks.com/ja/exploratory-data-analysis/index.html)
- [ビジュアライゼーションの種類 \|Databricks on AWS](https://docs.databricks.com/ja/visualizations/visualization-types.html)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

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