Livebook から Snowflake に接続して SQL を実行する

## はじめに

Livebook Launch Week 2 を自分でやってみるシリーズ

- Day1: [Smart Cell からのリモート接続](https://qiita.com/RyoWakabayashi/items/d2f19a674c261790d999)
- Day2: [Whisper による音声認識の新機能](https://qiita.com/RyoWakabayashi/private/4db05611945f3bba6e30)
- Day3: [ファイルをドラッグ＆ドロップすると、扱うためのコードを自動生成する](https://qiita.com/RyoWakabayashi/private/0a2760c88001076c0c7b)
- Day4:
  - データクラウド Snowflake に接続する　 <- ここ
  - [Microsoft SQL Server に接続する](https://qiita.com/RyoWakabayashi/private/ab1ce456eaa14b1da6f8)
- Day5: [Vim と Emacs のキーバインド](https://qiita.com/RyoWakabayashi/items/c95934c690d663918a8a)

Day 4 はデータベースとの統合です

https://news.livebook.dev/integration-with-snowflake-and-microsoft-sql-server---launch-week-2---day-4-2o4z9C

今までも PostgreSQL や MySQL などには接続できていましたが、 Snowflake と SQL Server にも接続できるようになっています

本記事では　Livebook 上で KinoDB を利用し、 Snowflake への接続、 SQL 実行をやってみます

PostgreSQL への接続、 SQL 実行についてはこちら

https://qiita.com/RyoWakabayashi/items/24ecd58f3ba8ad960347

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/kino/kino_db_snowflake.livemd

## Snowflake とは

Snowflake は **データクラウド** です

https://www.snowflake.com/ja/

詳細な説明は公式サイト等を見てもらうとして、私も今回初めて触れてみたのですが、ざっくりした印象を書いておきます

今までのクラウドデータベースは、あくまでも既存のデータベースをクラウドに持って行った、というものでした

それに対して、 Snowflake はクラウドであることを前提として、 **クラウドを使った理想的なデータの集積、整理、保護、処理、出力を一つのプラットフォームにまとめたもの** になっています

まさにクラウドネイティブなサービスで、インフラとして AWS や GCP 、 Azure の三大クラウドを選択できたり、当然それらとの連携がしっかり準備されています

個別にデータレイク、データウェアハウス、データマート用のデータベースシステムを構築して連携させる必要がなく、 Snowflake だけで完結できるのも便利です

## Snowflake の準備

まだ Snowflake のアカウントを持っていない場合、 30 日間の無料トライアルが使えるので、まずはサインアップしましょう

https://signup.snowflake.com/

![スクリーンショット 2023-11-02 14.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e359ae25-f8fd-e924-2c49-00c19259748b.png)

手順に従って進んで、最後に登録したメールアドレスに届いたメールからサインアップを完了すると、自分のアカウントのワークシート一覧が表示されます

![スクリーンショット 2023-11-03 23.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/680c1ba3-136f-35c4-4b1b-9c28342944e1.png)

無料トライアルではサンプルデータベースがすでに作成されているので、今回はこれを利用していきます

## Livebook の準備

いつもは以下のリポジトリーで自分用に作っている Docker コンテナで Livebook を起動しているのですが、今回はコンテナからでは上手くいきませんでした

https://github.com/RyoWakabayashi/elixir-learning

Livebook コンテナの OS が Debian 11 (bulls eye) になっているのですが、その環境上で Snowflake に接続するための ADBC が動作できませんでした
（発生したエラーを元に色々試したのですが、次から次へと不足しているパッケージが判明し、さらにそれらのパッケージを Debian 11 に入れることが困難で諦めました）

そのため、今回は macOS 上で直接 Livebook を起動しました

Livebook の README にある通り、 Elixir と Erlang のある環境下でコマンドを実行します

https://github.com/livebook-dev/livebook

```bash
git clone https://github.com/livebook-dev/livebook.git

cd livebook

mix deps.get --only prod

MIX_ENV=prod mix phx.server
```

## セットアップ

Livebook で新しいノートブックを開きます

セットアップセルに以下のコードを入力して実行しましょう

```elixir
Mix.install([
  {:kino_db, "~> 0.2"},
  {:kino_explorer, "~> 0.1"},
  {:adbc, "~> 0.2"}
])
```

ADBC = Arrow Database Connectivity は Snowflake 以外にも様々なデータベースとのインタフェースを提供してくれます

https://github.com/elixir-explorer/adbc

## DB への接続

Smart Cell　の Database connection を追加します

![スクリーンショット 2023-11-04 0.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fd9ef78a-f20d-45f4-b63c-dff651f8d87f.png)

すると、以下のような入力フォームが表示されます

![スクリーンショット 2023-11-04 0.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8dec1c46-6b4b-ef6e-d48d-3da54e5c186c.png)

Snowflake の画面左下をクリックすると、アカウント情報が表示されるので、ここの情報を元に入力してください

![スクリーンショット 2023-11-04 0.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/970fa3c7-3b14-b0a5-95fc-68ced2fac2e4.png)

User name は左側中段に表示されているものを小文字にして入力します

Account は右側上段のリンクアイコンをクリックし、アカウント URL をコピーして入力します

ただし、先頭の `https://` （プロトコル）は削除し、ホスト名だけを指定してください

Snowflake の画面左メニューで Data をクリックすると、データベースの一覧が表示されます

今回はサンプルデータベースを使用して、以下のように入力します

- Database: snowflake_sample_data
- Schema: tpch_sf1

![スクリーンショット 2023-11-04 0.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/cb387d8e-816a-9410-18d7-8caae01a1ece.png)

Password は Snowflake へのサインイン時に使用するものを入力してください

全て入力したら Smart Cell の左上 Evaluate をクリックします

結果が `{:ok, #PID<0.1494.0>}` のようになれば接続できています

## SQL の実行

Smart Cell で SQL query を追加します

![スクリーンショット 2023-11-04 0.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f2307592-ab79-12f2-a6d8-0ae5470b2ae5.png)

以下のようなフォームが表示されるので、 SQL を変更して左上 Evaluate をクリックします

![スクリーンショット 2023-11-04 0.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/99e2904b-2b69-ea4f-d366-681f3d7b9a3f.png)

```SQL
SELECT * FROM lineitem
```

結果は以下のようにデータテーブルで表示され、自動的に列毎の基本統計量など（最小値、最大値、平均、欠損値数）も算出されています

![スクリーンショット 2023-11-04 0.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b587876d-79a7-b337-9c0e-f8d7228de367.png)

## まとめ

KinoDB を使うことで、簡単に Livebook から Snowflake に接続、 SQL 実行ができました

Livebook なら Smart Cell で Elixir をほぼ書かずに実装できるのが良いですね

しかもデータがテーブルで表示されるので、結果も確認しやすいです

Snowflake 自体をまだまだ使いこなせていないので、今後色々試してみようと思います