Databricksのデータベースを可能な限りわかりやすく解説

先日こちらの記事を投稿しました。

https://qiita.com/taka_yayoi/items/075c6b3aeafac54c8ac4

自分にとってのもう一つの謎は、 **Databricksでデータベースを使いたい(SQLを使ってデータにアクセスしたい)場合にはどうすればいいのか？そもそも、データベースはあるのか？** ということでした。

以下のような記事を書いてくる中で腹落ちはしましたが、今回も絵や実例を駆使して可能な限り分かりやすくDatabricksにおけるデータベースを説明してみたいと思います。これでも分かりにくい場合には私の修行がまだ足りないので精進します。

- [Databricksにおけるデータベースおよびテーブル](https://qiita.com/taka_yayoi/items/e7f6982dfbee7fc84894)
- [Databricksレイクハウスにおけるデータオブジェクト](https://qiita.com/taka_yayoi/items/e90be9beeb1a744cee0d)
- [Databricksを使い始めたときに感じる疑問 \+ ベストプラクティス](https://qiita.com/taka_yayoi/items/8718c7c7d922e6f942bc#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B)

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

:::note
**注意**
この記事のスコープには[Unity Catalog](https://qiita.com/taka_yayoi/items/15aede468bdca58ec6a3)を含めていません。Unity Catalog(UC)ではデータベースにさらに新たなコンセプトを導入しているので、別途UCもスコープに含めた記事を書く予定です。
:::

# Databricksにデータベースはあるのか？SQLでデータを操作できるのか？

**答え** データベースはあります。SQLで操作もできます。

ただ、ここはそもそものデータベースの定義など踏まえて説明をした方が良いと思います。こちらの記事でも引用していますが、

https://qiita.com/taka_yayoi/items/da227cec883c410de78e#sql%E3%81%A8%E3%81%AF

**データベースとは**
>コンピューティングにおいて、**データベース**は、電子的に保存され、アクセスできる組織化された**データの集合**である。

この定義に沿って考えれば、答えは**YES**です。しかし、OracleやSQL Server、MySQL、Snowflakeのようなデータベース管理システム(DBMS)がインストールされているのか？と聞かれると答えは**NO**となります。これらのDBMSやデータウェアハウスとDatabricksにおけるデータベースは実装が異なります。

では、なぜDatabricksにおけるデータベースの実装が他のデータベース管理システムやデータウェアハウスと異なるのでしょうか。それは、Databricksが**レイクハウス**であることに由来します。Databricksの実装の説明をする前に、このレイクハウス誕生の背景を説明させてください。

# レイクハウス誕生の背景

こちらでレイクハウス誕生の経緯の説明と、レイクハウスとデータウェアハウス、データレイクとの比較をおこなっています。

https://qiita.com/taka_yayoi/items/1ebbce9b76fb923d5e21

## データウェアハウスの出現

まず、データ管理プラットフォームとして**データウェアハウス**(個人的にはデータベースと同義だと思っています)が1990年台に台頭し、多くの企業で導入されました。ビジネス上の意思決定を行うためにデータを蓄積し、BIなどを通じて意思決定にデータが活用されるようになりました。データウェアハウスの特徴をざっくり列挙します。

- 行と列で構成される構造化データを蓄積
- SQLによる問い合わせ、加工が可能
- (比較的)大量のデータを管理可能

![Screen Shot 2022-12-25 at 17.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/51dd9366-402e-eccc-f92d-2738dbc78193.png)

これらの特徴は現在においても多くの企業のデータ活用に役立っており、ある意味成熟したテクノロジーと言えます。しかし、ここ数年、このデータウェアハウスでは応えられない要件が出現しています。そう、機械学習やAIの活用です。

## データレイクの台頭

BIやSQLを用いた分析など、過去の構造化データを蓄積し、活用するというシーンにおいてはデータウェアハウスは非常に有用です。一方、機械学習モデルをトレーニングし、将来の予測に活用する、画像やテキストを分析するという要件にデータウェアハウスは応えることができませんでした。そのため、機械学習・AIのニーズに応えることのできる新たなデータ管理プラットフォームが求められました。これによって、2010年頃に**データレイク**誕生しました。データレイクの特徴をざっくり列挙します。

- クラウドサービスのオブジェクトストレージにデータを格納
- 構造化データ、非構造化データに対応
- 理論上、容量は無制限
- 機械学習のワークロードとの親和性が高い

![Screen Shot 2022-12-25 at 19.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/36605f43-41d7-365e-def6-e1ff90ffee15.png)

これによって、データレイクを活用し始めた人々は機械学習・AIによる明るい未来を夢想しました。しかし、世の中はそんなに甘くありません。上述の特徴は確かに機械学習の取り組みにおいては非常に有用なものでありましたが、企業の取り組みにおける重要な観点が欠落していました。**パフォーマンス**と**ガバナンス**です。オブジェクトストレージに無尽蔵にデータを格納できたとしても、検索・更新に非常に時間を要してしまい、さらには、管理がなされないためゴミだらけでのデータレイクになってしまうということが頻発しました。結果として、データレイク(湖)ならぬデータスワンプ(沼)とまで揶揄されるようになってしまいました。

## レイクハウスの誕生

[上の記事](https://qiita.com/taka_yayoi/items/1ebbce9b76fb923d5e21#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AF%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE%E5%87%BA%E7%8F%BE)にもレイクハウスがなぜ必要だったのかという説明がありますので、詳細はここでは割愛しますが要はこれまでに出現しているデータプラットフォームそれぞれでは、今の機械学習・AIのニーズに応えきれないから(データ)レイクハウスが開発されたということです。

![Screen Shot 2022-12-25 at 19.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0705a7a3-e155-a7a5-3d0d-f5335484450c.png)

元記事にも記載されていますが、レイクハウスではデータはオープンなフォーマットでクラウドストレージに格納します。これによって、ベンダーロックインの回避、無限のストレージ、機械学習ワークロードとの親和性といったことを実現します。さらに、データウェアハウスで培われたパフォーマンスやガバナンスをも実現しているのです。

# Databricks(レイクハウス)におけるデータベースの実装

前置きが長くなりましたが、レイクハウスでは生データはas-isの状態でクラウドのオブジェクトストレージに保存することで、上述のメリットを提供しています。なので、まずはDatabricksは**ファイルベース**のデータ管理を行っていることに留意する必要があります。一方、従来のデータベースはファイル管理をデータベースでカプセル化しているので、ユーザーの方は通常はファイルを意識することはほとんどありません。個人的にはこの実装の違いがとっつきにくい所になっているのかなと思います。

ただ、従来のデータベースでは、パフォーマンスを最適化した独自フォーマットでデータを保持することで上記のカプセル化を実現しており、そのためにはデータベースへのデータのインポート(コピー)が発生することに加えて、敢えてベンダーロックインされに行っているとも言えます。

レイクハウスでは、オブジェクトストレージに生データを配置することでユーザーの自由度を担保しつつも、繰り返しになりますが、高いパフォーマンスとガバナンスを実現しています。この部分に関しては[Delta Lake](https://qiita.com/taka_yayoi/items/685a6a142548d43f7782)が重要な役割を担っているのですが、本記事の主旨から若干外れるので割愛します。

一般論になりますが、クラウドストレージは容量無制限というメリットがある一方で、膨大な数のファイルの一覧に時間を要するという課題が存在しています。このアーキテクチャにおいて、SQLを実現する際にこれが大きな障壁となります。この課題を解決するためにDatabricksでは**メタストア**が導入されています。

SQLといえば、`SELECT`文が有名ですが、

```sql:SQL
SELECT * FROM hoge;
```

というようにテーブルを指定して各種の操作を行います。従来のデータベースを利用している際には、テーブルを作成すればそのままSQLを適用できる訳ですが、上述の通り、Databricksではファイルベースのデータ管理をおこなっているので、 **このテーブルはどのファイル？** という紐付けをしてあげないと、SQLを発行することができません。これを助けてくれるのが**メタストア**です。名前の通り、メタデータを格納するデータベースです。この場合はファイルのメタデータを格納することで、SQLを実行する際に**このテーブルはこのファイルです**という関連づけを行なってくれます。メタストアを活用することで、ファイルベースのデータ管理をしている中でも、テーブルに対応するファイルを高速に特定できることに加え、テーブルをシームレスに参照してSQLを実行できるようになります。

DatabricksではデフォルトでHiveメタストアが同梱されているので、これを活用することでデータに対してSQLを実行できるようになっています。**ファイルフォーマットによりますが**、データをメタストアに登録すれば、あとは自動でデータとメタデータが同期されるようになります。

![Screen Shot 2022-12-25 at 20.00.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6bb981a-1363-86a3-c3fb-ff33b522c090.png)

:::note
**注意**
- Databricksの処理エンジンは[Apache Spark](https://qiita.com/taka_yayoi/items/780e4ec1d69a5e0d477b)ですが、Spark自身がSQLをサポートしていますので、DatabricksではネイティブでSQLをサポートしています。
- メタストアを介さずにファイルを指定してSQLを実行することもできます。後ほどデモします。
:::

# DatabricksにおけるSQLの活用

まず、メタストアに登録されているデータは、サードメニューの**データ**からアクセスすることができます。`データベース.テーブル`という2レベルの名前空間となっています。

![Screen Shot 2022-12-25 at 20.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b22133fc-59fa-e17c-e631-497d368a59c3.png)

:::note
**注意**
Unity Catalogでは新たにカタログが導入され、`カタログ.データベース.テーブル`という3レベルの名前空間になっています。
:::

## テーブルの参照

SQLノートブックを作成すれば、デフォルト言語がSQLとなりますので、このノートブックで自由にSQLを操作することができます。データベースを一覧します。

```sq:SQL
SHOW DATABASES;
```
![Screen Shot 2022-12-25 at 20.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a565e690-9336-d67f-25bf-169cde86e651.png)

データベースを選択して、データベース内のテーブルを一覧します。
![Screen Shot 2022-12-25 at 20.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b23bf1d7-86fe-3bf3-02cf-76391b59c71c.png)

テーブルに`SELECT`を実行します。

```sql:SQL
SELECT * FROM diamonds;
```

データベースと同じように結果を取得することができます。
![Screen Shot 2022-12-25 at 20.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b1daf4b5-9342-e69d-5bab-763f46a0ef18.png)

なお、`DESCRIBE`句を用いることでテーブルのメタデータを確認することができます。

```sql:SQL
DESCRIBE DETAIL diamonds;
```

![Screen Shot 2022-12-25 at 20.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/68762d20-e174-be10-0fcd-59a76c75e2fe.png)

`location`でテーブルの格納場所を確認することができます。

## メタストアを介さずにSQLを実行

上で触れたように、メタストアを介さずにSQLでファイルパスを直接指定することができます。ただ、この場合、テーブル名という概念なしに操作を行うので、柔軟性という意味では若干難ありでクイックに内容を確認する、ファイルからテーブルを作成するという用途に使う形になるかと思います。`フォーマット.パス`という書式です。

```sql:SQL
SELECT * FROM csv.`dbfs:/databricks-datasets/atlas_higgs/atlas_higgs.csv`
```
![Screen Shot 2022-12-25 at 20.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f8dccba6-6f24-2d17-835a-0f2f649017d3.png)

## テーブルの作成

メタストアに登録しなくてもSparkを用いてSQLを実行できるのは、上のセクションで述べた通りなのですが、一緒に作業している人たちが毎度ファイルパスを見にいくよりはメタストアに登録されたテーブルを参照した方がコラボレーションしやすいと思います。そのため、データはメタストアに登録することをお勧めします。以下の例では、ファイルシステムに格納されているParquetファイルから読み込んだデータをテーブル`fraud`としてメタストアに登録しています。

```sql:SQL
CREATE TABLE fraud USING DELTA AS SELECT * FROM parquet.`dbfs:/databricks-datasets/credit-card-fraud/data/`
```

![Screen Shot 2022-12-25 at 20.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/43617fd7-4baf-6046-a248-903135a1a60a.png)

こうすることで、あなたを含めた皆様がデータにアクセスする際にSQLを用いてテーブル`fraud`を参照できるようになります。
![Screen Shot 2022-12-25 at 20.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce8930af-a924-43fb-7a94-13f0b39d39c2.png)

# まとめ

データの永続化ではデータベース、データウェアハウスを活用するというのは非常に合理的な選択肢と言えます。SQLのパワーを活用することで様々なデータ処理を実現できるようになります。メタデータとデータファイルという概念は最初は取っ付きにくいかもしれませんが、柔軟性やパフォーマンス、オープンフォーマットの維持(ベンダーロックインの回避)などの観点で非常にメリットが多いアーキテクチャと言えます。さらに、ファイルフォーマットを[Delta Lake](https://qiita.com/taka_yayoi/items/f206f22c4b15b6fbc7f5)にすることで、メタデータの同期、データのバージョン管理、非構造化データの管理、高パフォーマンスなど更なるメリットを享受することができますので、データレイクにDelta形式でデータを保持し、快適なSQLライフを楽しんでいただければと思います。

### Databricks 無料トライアル

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