12月なのでsnowflakeはじめよう

# はじめに
去年のアドカレ以来の投稿になるという体たらくを発揮してしまいました。
12月なので、最近よく話題に上がるsnowflakeを触ってみようと思います。
ロゴもすごい。12月感すごい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/86fa51fe-61b7-1c75-6521-3db5821af3b1.png)

# 題材
フリートライアル用ハンズオン資料が公開されていますので、これを題材に進めます。
[HANDS-ON LAB GUIDE FOR SNOWFLAKE FREE TRIAL](https://s3.amazonaws.com/snowflake-workshop-lab/Snowflake_free_trial_LabGuide.pdf)

# やること
ハンズオンのMODULE 1~5を中心に、ざっくり以下をやってみます。

- snowflake上でテーブル作成
- AWS S3上にあるcsvファイル郡をsnowflakeにロード
- snowflakeのコンピュートノード(ウェアハウス)を利用して分析

# 狙い

以下基本的な概念、インターフェースや流れを掴む所を目指します。

- テーブル
- ステージ
- ウェアハウス

# 1. トライアルサインアップ
以下URLよりトライアルサインアップしてください。

https://signup.snowflake.com/?_l=ja
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/9bb06c4c-d26d-585b-dc94-87dfe8153fc6.png)
以下の通り選択して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/3bdab3cf-42df-7185-8eaa-76d420ddceb0.png)

UIが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/4e6a47cd-afb3-4bc9-d0fd-56eba3a655e4.png)

ここでURLが以下になってるのに気付きます。
> https://(account).ap-northeast-1.aws.snowflakecomputing.com/

snowflakeはクラウドプラットフォーム(AWS/GCP/Azure)で稼働します。
これは既に別のサービスがクラウド上でホスティングしている(例えばAWSのap-northeast-1を中心にサービス稼働している)場合、同じクラウドプラットフォーム上でsnowflakeをホストできることを意味します。

なんとなくピンとくるかもしれませんが、これはデータ転送料金など関係してきそうですね。
[ドキュメント: サポート対象のクラウドプラットフォーム](https://docs.snowflake.com/ja/user-guide/intro-cloud-platforms.html)

# 2. UI確認/準備

`データベース` をクリックしてみましょう。

データベースタブには作成した、もしくはアクセス権限を持っているデータベースに関する情報が表示されます。
フリートライアル環境にいくつかのデータベースが既に存在していますね。
(ラボではこれらは使用しませんでした)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/d5b7f375-b464-cb5d-3129-61a87ea1d607.png)

`ワークシート` は SQLを実行、結果を確認する画面です。
基本的にこの画面でSQLを実行しながら進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/e2ce3d4c-11ca-43ed-9332-471fd3d202c6.png)

ラボで利用するsqlファイルを以下からダウンロードしましょう。
[lab_scripts_free_trial.sql](https://s3.amazonaws.com/snowflake-workshop-lab/lab_scripts_free_trial.sql)

`ワークシート` の `▼` を選択し、 `スクリプトをロード` から、DLしたsqlファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/bbd0a544-35a6-1fda-d646-5fa4e7be1a24.png)


SQLが表示されました。このSQLを一部選択 -> 実行を繰り返してラボは進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/bb90b72d-763b-59f6-c362-a683e593dc24.png)

# 3. データロード

## 3-1. データベース作成
このラボには以下のシナリオがあるようです。

> ニューヨーク市にある公共自転車共有システム `CitiBike` のデータを分析しライダーに最適なサービスを提供する方法を理解したい。

まずはデータベース `Citibike` を作成しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/581c6c70-4955-2f21-ef6b-6af6abe88132.png)

ロードしたSQLの以下部分のみ選択し、 `実行`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/b41fac32-50d9-66b1-bb06-c7cbe8eefbbe.png)

```sql
create or replace table trips  
(tripduration integer,
  starttime timestamp,
  stoptime timestamp,
  start_station_id integer,
  start_station_name string,
  start_station_latitude float,
  start_station_longitude float,
  end_station_id integer,
  end_station_name string,
  end_station_latitude float,
  end_station_longitude float,
  bikeid integer,
  membership_type string,
  usertype string,
  birth_year integer,
  gender integer);
```

結果が表示されました。成功したようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/4079e3a6-5aef-336a-92c6-0f2754d1189a.png)

`データベース` のテーブルを見ると、確かにテーブルが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/b33f0a7e-2006-e73c-5821-1d8fa52cd84c.png)

## 3-2. ステージ設定
このテーブルに外部に存在するCitibike利用ユーザのトランザクションデータをロードします。
データはpublicなs3 bucket上に存在するようです。

そのためには`ステージ` という設定を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/009b26a4-c0b6-abdd-a8cc-3df7d943d0f4.png)

ステージを選択できるので、 S3を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/b3743cde-ac52-fa8a-3576-5130745cee24.png)

名前: citibike_trips
スキーマ名: PUBLIC
URL: s3://snowflake-workshop-lab/citibike-trips

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/a1e9a5ac-36ca-6fb1-5016-7d315ff0719e.png)

ステージ設定ができました。(まだ実際のロードはしていません。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/440c68ca-99ae-67fa-0ee4-e975a9a668f3.png)


`ワークシート` で以下SQLを実行してstageの中を覗いてみましょう。

```sql
list @citibike_trips;
```

たくさんのcsv(gz圧縮)が存在することがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/2281bf83-84ff-a72a-f2f0-a8fdba4a4bb0.png)

## 3-3. ファイル形式設定
続いてより詳細なcsv形式について設定します。
`ファイル形式` タブにて、以下の通り設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/e1c253ec-5699-a5c5-bc64-d6a30cd99420.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/ce8841d5-bf0f-ac19-0a51-3374bd589994.png)

(スクロール下の設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/babd2bc0-c9ab-e0d7-ed91-3ec038a08c59.png)
ファイル形式設定も完了しました。(まだまだ実際のロードはしていません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/8b68e95c-29d1-668c-f182-bf77fb73afa9.png)


## 3-4. ウェアハウス作成
続いて実際にcsvをsnowflakeにロードしてみます。

ロードするにはコンピューティングリソースが必要です。
Snowflakeのコンピュートノードは `ウェアハウス` と呼ばれ、ワークロードに応じて動的にスケールできます。

`ウェアハウス` タブを選択すると、既にデフォルトのウェアハウスが存在しているようです。
選択して`構成` をクリックしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/a29643ef-a4db-4079-ff03-1eb0198541f4.png)

サイズなど、コンピューティングリソースの設定ができるようです。
サイズを `S`と設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/17c546d2-339a-87f0-b3df-4866ac6a0aa5.png)

## 3-5. COPYコマンド実行

`ワークシート` に移動します。
SQL実行画面の `Context` をクリックすると、`ウェアハウス` が確認でき、サイズも `S` となっています。
SQL実行時にどのウェアハウス (コンピューティングノード) で実行するかを選択できるようですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/04189f2d-9e91-041b-5515-c9c0798d4978.png)

では、以下SQLで実際にデータをロードします。

```sql
copy into trips from @citibike_trips file_format=CSV;
```

ロードできました。
実行後、`履歴` タブに移動すると実行時間やスキャンサイズなど、クエリの詳細がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/f4d68332-b791-c54e-7ca9-ac1a7c2a4a42.png)

以下にて、実際にテーブルにデータが存在していることがわかります。

```sql
select * from trips limit 20;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/34977cf4-614c-a67a-a6b5-022c77ca1fa2.png)

# 4. 分析
では、分析開始です。


1時間ごとの統計をだしてみます。

```sql
select date_trunc('hour', starttime) as "date",
count(*) as "num trips",
avg(tripduration)/60 as "avg duration (mins)", 
avg(haversine(start_station_latitude, start_station_longitude, end_station_latitude, end_station_longitude)) as "avg distance (km)" 
from trips
group by 1 order by 1;
```

サイズ `S` のウェアハウスで実行しました。
`44,295行` を `84ms` で結果が返ってきています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/e3abc17f-5415-91c4-c952-ccf6e72c006c.png)

サイズを `L` に変更してもう一度実行してみました。
`84ms` -> `62ms` となりました。
サイズに応じてスケールできていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9038/4a94ef7f-3681-4392-fc06-4529c9702d02.png)

# おわりに
snowflakeのハンズオンを題材にさわりだけやってみました。
まだまだ色々できそうですが、概念レベルは掴めた感じがします。
もう少し触ってみようと思います。