【Snowflake】Snowpark for PythonでStreamlit始めてみた

【Snowflake】Snowpark for PythonでStreamlit始めてみた | Tableau-id Press -タブロイド-
snowflake_logo

こんにちは!奥津です。

truestarアドベントカレンダー12月7日、Snowflakeのハンズオンをつまずきながらやっていく記事です。
やってみるハンズオンはこれです。
Getting Started With Snowpark for Python and Streamlit

Snowpark for Pythonとは

11月に一般公開されたSnowpark for Python、これを使うとPythonでSnowflake上のデータを操作できます。
これまでもPythonでコネクターを用いて接続することはできましたが、

・SQLを記述する必要がある
・Pythonでのデータ分析を行うにはデータを一度Snowflakeから出す必要があり、Snowflakeのウェアハウスで高速処理することができない

といった状況から、Snowpark for Pythonを使うと

・使い慣れたPythonでデータ操作できる
・Snowflake上でウェアハウスを用いてPythonでのデータ分析を高速で行える

といった大きなメリットがあります。(コネクタとSnowparkの比較はこのブログがわかりやすい。)

Streamlitとは

StreamlitはPythonでWebアプリケーションを作成できるフレームワークで、
htmlやcss、Javascriptなどフロントエンドの知識がなくても、
Pythonだけで素早くWeb上でいい感じに可視化、共有することができます。

(こんな風にいい感じに可視化してくれる)

Snowpark for Pythonで使えるパッケージにも含まれています。

SnowflakeとStreamlitとアプリのシェアのこれから

そしてこのStreamlit、今後SnowflakeのWebUI上で作れるようになるんです。(まだプライベートプレビュー)
さらにPythonも、SnowflakeのWebUI上でコーディングできるようになります。(これもまだプライベートプレビュー)

(Snowflake WebUI上でPython書いてStremlitを使っているデモ

そしてこの作成したWebアプリ、今Snowflake Marketplaceでデータがシェアできるように、他ユーザーとシェアできるようになります。
(ちなみに、このアプリのシェアができるようになったタイミングで、Snowflake Data MarketplaceからSnowflake Marketplaceに名称も変更になっています。)
つまり、たとえばiPadさえあれば、Snowflake上でデータ使ってコード書いてアプリ作ってシェアしてマネタイズまで全部できる、、!すごい、、!
データ分析とデータ活用の垣根がどんどん瓦解していく感じがしますね。
このあたりの情報はいつもお世話になっているClassmethodさんのDevelopersIOで詳しくまとめてくださっています。

Snowpark for PythonとStreamlitのハンズオンをやってみる

さて、ここまでいつも使ってます感出してましたが、
日頃Python使ってなければ(「使い慣れたPython」とかどの口)Streamlitに触れたこともなかったので、
冒頭のSnowflakeが用意してくれているハンズオンをやってみようと思います。
(ちなみにSnowflakeはすごい数のハンズオンが続々公開されています、、すごい、、GETTING STARTED WITH SNOWFLAKE

基本的な流れは以下です。
Snowflake Marketplaceのデータを使い、Snowpark for Pythonを使って、Streamlitで可視化します。
・データの準備
・Snowpark for Pythonの設定
・Pythonスクリプトの作成&実行

1.データの準備

基本的な詳しいやり方はハンズオンにまかせるとして、ここからは感想やつまずいたことを書いていきます。
まずデータの準備。今回使うデータはSnowflake Marketplaceに公開されているデータなので、Snowflakeのアカウントを持っていればクリックひとつでとっても簡単。

(Get Dataするだけ)

すぐに使えるようになります。国ごとの温室効果ガス排出量や気候データが含まれているようですね。
WebUI上で簡単にデータを確認できますし、サンプルのSELECT文もついているのでどういう観点でデータを見たら良いかもわかりやすいです。

2.Snowpark for Pythonの設定

続いてPythonの環境設定です。minicondaのダウンロードから案内されていますが、
Python 3.8環境なら大丈夫とのことなので、Anaconda Promptを使って設定していきます。
といってもSnowpark for Pythonをインストールするだけ。一緒にPandasとStreamlitもインストールします。

3.スクリプト作成、実行

ハンズオンに従い

・Snowflakeへの接続に必要な情報
・データのロードの設定
・Streamlitの可視化の設定

をスクリプトに記載し、実行!

(snowpark) C:\Users\XXXXX>C:\Users\XXXXX\my_snowpark_streamlit_app.py

Traceback (most recent call last):
  File "C:\Users\XXXXX\my_snowpark_streamlit_app.py", line 2, in <module>
    from snowflake.snowpark import Session
ModuleNotFoundError: No module named 'snowflake'

(エラー。そんな馬鹿な、、、!)

4.エラー解消(追記)

初投稿時はエラーを解消できませんでしたが、以下を確認したことでエラーを解消することができました!

・実行する環境が切り替わっていることを確認する

「2.Snowpark for Pythonの設定」の中で、snowparkという名前の環境を作成しそこに必要なものをインストールしているので、
この環境じゃないと実行できません。改めて確認。

(base) C:\Users\XXXXX>conda activate snowpark
(snowpark) C:\Users\XXXXX>
(baseからsnowparkへ環境を切り替える)

streamlit run my_snowpark_streamlit_app.pyで実行する

作成したスクリプト「my_snowpark_streamlit_app.py」を実行する際、Anaconda Promptでスクリプト名だけ打って実行していましたが、
これがエラーの原因になっていました。「streamlit run my_snowpark_streamlit_app.py」と、streamlitでrunする必要がありました。
ハンズオンちゃんと読めよ自分、、。

(snowpark) C:\Users\XXXXX>streamlit run my_snowpark_streamlit_app.py
(こうするとModuleNotFoundErrorが出ない)

・スクリプトのデータベース名を修正する

ハンズオンをほぼコピペしてスクリプトを作りましたが、
Snowflakeログイン情報のデータベース名がそのままだと一致しないので、修正する必要がありました。

SnowparkSQLException: (1304): 01a9002c-0000-a720-0000-94a50002300e: 090105 (22000): 01a9002c-0000-a720-0000-94a50002300e: Cannot perform SELECT. This session does not have a current database. Call 'USE DATABASE', or use a qualified name.
(そのままだとエラーになる)
# Create Session object
def create_session_object():
   connection_parameters = {
      "account": "<account_identifier>",
      "user": "<username>",
      "password": "<password>",
      "role": "<role_name>",
      "warehouse": "<warehouse_name>",
      "database": "ENVIRONMENT_DATA_ATLAS", # "KNOEMA_ENVIRONMENT_DATA_ATLAS"のままだとエラー
      "schema": "ENVIRONMENT"
   }
   session = Session.builder.configs(connection_parameters).create()
   return session
(ログイン情報のデータベース名を修正)

5.再実行(追記)

上記エラーを解消したところ、実行できました。
SQLに変換されているのがわかります。

 (独特なSQLに変換されていく。)

そして処理が終わると、、。

(すごい!)

Streamlitすごいですね、Pythonだけで、簡単な設定しかしてないのにヌルヌル動くいい感じの可視化ができました。
Streamlitもっとやってみたいな、、と思ったところ、#30DaysOfStreamlitという教材があるようなので、今度はこれに取り組んでみようかなと思います。

truestarで作成したSnowflakeアプリケーション

さて、truestarでは実は既に、Snowflakeのアプリのシェアの仕組み(Snowflake Native Application)を一足早く使ってアプリを作成しています。
Snowflake Native Applicationのメリットを紹介しながら、最後にはStreamlitでの実装を試みています。デモ映像もあるのでぜひ見てみてください。
初めてのSnowflake NativeApplication
このアプリ作成をリードした三村さんに教えを請い、ハンズオンを終えることができました。
みなさんもぜひやってみてください!