LoginSignup
8
12

Snowflake Notebooksを試してみよう!

Last updated at Posted at 2024-05-26

Snowflake Notebooks

Snowflake NotebooksはSnowflakeのWeb UIであるSnowsight上で提供されている開発環境です。SQL、Python、Markdownを一つのノート上に混在して記述できるのが特徴です。
互換性があるかは分からないですが、Jupyter Notebookのようなサービスになっています。

Snowflake Notebooks

このサービスが先日2024/5/25にPublic Preview (PuPr)されたようです!

事前準備

ノートブックを作成するロールに対してCREATE NOTEBOOK権限が必要なようです。例えば以下のようなコマンドを実行すればよさそう。

-- 権限があるロールになる
USE ROLE ACCOUNTADMIN;
-- notebook_test.publicにノートブックを作成できる権限をSYSADMINに与える
GRANT CREATE NOTEBOOK ON SCHEMA notebook_test.public TO ROLE SYSADMIN;
-- SYSADMINになる
USE ROLE SYSADMIN;

Snowsightをリロードすれば左上のCreate(作成)メニューからノートブックの作成ができるようになっています。

Create

事前準備その2:適当なデータセットを準備する

今回はついでに映画のレーティングに関するデータセット(ml-latest-small.zip)を以下のサイトから取得して、ロードしました。1
利用規約はREADME.htmlをご参照ください。

GUIからロードする場合は最初の行をヘッダとして使うように設定すれば問題なくロードされるはずです。

Load MovieLens Dataset

ノートブックの操作

Snowsightからノートブックを作成するとサンプルが入力された状態で始まるので雰囲気で動かせると思いますが、以降いくつかメモしておきます。

セッションの取得

セッションはPythonセルからデータベースを参照するために必要となります。セッションの取得は最初に入力されているサンプルに含まれています。

# Import python packages
import streamlit as st
import pandas as pd

# We can also use Snowpark for our analyses!
from snowflake.snowpark.context import get_active_session
session = get_active_session()

cell1.png

SQLセルからデータベースを参照

普通のSQLワークシートと変わりません。

-- SQLセルからDatabaseを参照
select * from movies limit 100;

cell2.png

Pythonセルからデータベースを参照

最初に取得したセッションを使用します。table()sql()を使います。
SnowflakeのライブラリであるSnowparkを使ったことがある人なら特に困らないと思います。

# PythonセルからDatabaseを参照
# to_pandas()Pandas DataFrameに変換して扱う
ratings_df = session.table("RATINGS").to_pandas()
ratings_df = ratings_df.head()
# Pythonセルで定義された変数は後段の処理から変数名で参照できる
test_var = 100
# print()も使えるがマジックコマンド(変数名ベタ書き)で出力するのがNotebook的なので推奨
# マジックコマンドで出力すると後段の処理からセル名(cell3)でも参照できるようになる
ratings_df

cell3.png

PythonセルからSQLセルを参照

セル名を使って参照します。
SELECT文を実行したSQLセルはSnowflakeQueryResultという内部的に使用するオブジェクトなので、to_pandas()to_df()でDataFrameに変換してあげます。

# PythonセルからSQLセルを参照
# セル名(cell2)で参照できる。cells.cell2としてもよい
movies_df = cell2.to_pandas()
movies_df

cell4.png

PythonセルからSQLセルを参照:Snowpark DataFrameに変換する

大きめのデータセットに対してDataFrameで色々な操作を行いたい場合は、Snowpark DataFrameを使う方が効率的かもしれません。
to_df()でSnowpark DataFrameに変換できます。

# Snowpark DataFrameにも変換できる
snowpark_df = cell2.to_df()
snowpark_df

SQLセルからSQLセルを参照

セル名を{{ }}で囲ってあげればOK。

-- SQLセルからSQLセルを参照する
select * from {{cells.cell2}};

cell5.png

SQLセルからPythonセルで定義された変数を参照

こちらも変数名を{{ }}で囲ってあげればOK。

cell6.png

-- SQLセルからPythonセルで定義された変数を参照する
select {{test_var}};

例えば以下のようなことができます。

-- cell2はSQLセルの結果
-- test_varはPythonセルで定義された変数
-- これを組み合わせたSQL文を実行する
select * from {{cells.cell2}} where movieid = {{test_var}};

cell7.png

DataFrameをテンポラリテーブルに書き出す

Snowpark DataFrameであれば簡単にテンポラリテーブルに書き出すことができます。

# Snowpark DataFrameにも変換できる
snowpark_df = cell2.to_df()
# テンポラリテーブルで書き出す
snowpark_df.write.mode("overwrite").save_as_table(table_name="cell8_tbl", table_type="temporary")

cell8.png

SQLセルからPythonセルで加工されたDataFrameを参照する

Pythonセルからテンポラリテーブルに書き出すようにすればシンプルに参照することができます。
…がこれはもっといい方法が用意されてそうな気も。

-- SQLセルからPythonセルのDataFrameを扱う方法がテンポラリテーブルを経由するしか思いつかなかった
-- もしかしたらもっといい方法が準備されているかも
select * from cell8_tbl;

cell9.png

Markdownセルを参照…できない

少し試した範囲ではPythonセルからMarkdownセルを参照することはできなさそうです。
もしかしたら何か方法が用意されているかも。

# Markdownセルは参照できないらしい
print(cells.title)

cell10.png

お片付け

GUIでもノートブックを削除できますが、SQLで管理するための以下のようなコマンドが用意されています。

-- ノートブック一覧を取得する
SHOW NOTEBOOKS;

-- 削除する
DROP NOTEBOOK NOTEBOOK_TEST.PUBLIC."SAKATOKU 2024-05-26 23:14:35";

参考ドキュメント

以下のようなリソースが公開されています。
まだまだ情報は少ないのですが、これからドキュメントやPuPrを試してみた記事がたくさん出てくると思うので、楽しみですね!

デモのソースコード

デモ動画のプレイリスト

  1. F. Maxwell Harper and Joseph A. Konstan. 2015. The MovieLens Datasets: History and Context. ACM Transactions on Interactive Intelligent Systems (TiiS) 5, 4: 19:1–19:19. https://doi.org/10.1145/2827872

8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12