FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

Snowflake in Streamlit(SIS)が来たので触ってみる

はじめに

こんにちは、データチームにてデータ基盤開発を行なっています、井山です。 10周年記念として133日間ブログリレー50日目の投稿です。

以前Snowflake x Streamlit の記事を書きましたが

blog.flinters.co.jp

2023/09/19 に 遂にStreamlitの開発と実行がSnowflake上で可能になりました。(※まだ PublicPreviewの段階)

若干遅くなってしまったけど、早速触ってみましょう。

Snowflake in Streamlit とは?

www.snowflake.com

はい、読んで字の如く、Snowflake上でStreamlitのアプリを開発、実行できるものです。

実行環境などを用意する必要がなく、Snowflake上でPythonコードを記述することでデータを可視化することが可能になっています。

通常のSnowflakeのDashBoardでもある程度は可能ですが、Streamlitの場合はより高度な可視化が実現可能です。

実際に触ってみよう

とりあえずまずは触ってみようということで、トライアルアカウントでやってみます。

画面左側に Streamlit のメニューが追加されていますね。

完全に新規のアカウントだと

Streamlit is not activated for this account Streamlit apps cannot be created until your account has acknowledged Anaconda terms. To do so, an ORGADMIN must go to Admin → Billing & Terms and acknowlege the Anaconda terms. Please see docs for more information.

のようにAnacondaの利用規約の承認を行う必要がある旨の警告が表示されています。

Admin -> Billing & Terms から Anaconda を承認する必要があるのでまずはそれを行います。

承認後は下記の様に、UI画面上に + Streamlit App のボタンが出てくるようになります。

次に画面上部にあるサンプルスクリプトで必要な権限(DB、Schema等)などの設定を行います。

-- Streamlit apps are schema-level objects in Snowflake.
-- Therefore, they are located in a schema under a database.
-- They also rely on virtual warehouses to provide the compute resource.
-- We recommend starting with X-SMALL warehouses and upgrade when needed.

-- To help your team create Streamlit apps successfully, consider running the following script.
-- Please note that this is an example setup.
-- You can modify the script to suit your needs.

-- If you want to create a new database for Streamlit Apps, run
CREATE DATABASE STREAMLIT_APPS;
-- If you want to create a specific schema under the database, run
CREATE SCHEMA <SCHEMA_NAME>;
-- Or, you can use the PUBLIC schema that was automatically created with the database.

-- If you want all roles to create Streamlit apps in the PUBLIC schema, run
GRANT USAGE ON DATABASE STREAMLIT_APPS TO ROLE PUBLIC;
GRANT USAGE ON SCHEMA STREAMLIT_APPS.PUBLIC TO ROLE PUBLIC;
GRANT CREATE STREAMLIT ON SCHEMA STREAMLIT_APPS.PUBLIC TO ROLE PUBLIC;
GRANT CREATE STAGE ON SCHEMA STREAMLIT_APPS.PUBLIC TO ROLE PUBLIC;

-- Don't forget to grant USAGE on a warehouse.
GRANT USAGE ON WAREHOUSE <WAREHOUSE_NAME> TO ROLE PUBLIC;

-- If you only want certain roles to create Streamlit apps,
-- or want to enable a different location to store the Streamlit apps,
-- change the database, schema, and role names in the above commands.

トライアルアカウントで試すのみであれば Public スキーマ + AccountAdmin で実行できれば問題ないのでほぼこのままのクエリで実行しました。

(実際の環境であれば権限周りなどの対応が必要になると思うのでその辺りは適宜実施するイメージ)

streamlitのUIに戻り + Streamlit App より 追加を行います。

Streamlit App の追加には

  • App Name
  • Warehouse
  • App location
    • Database
    • Schema

上記の設定が必要になります、今回は下記のような形で追加。

  • App Name: Sample App
  • Warehouse: COMPUTE_WH
  • App location
    • Database: Streamlit Apps
    • Schema: Public

ちょっと読み込みがあったのち、上記のようにエディタとサンプルの Streamlit アプリが作成されました。

現在はデータの可視化や学習結果の予測値の表示などは基本的に他のBIツールや環境にデータを渡して実現していることが多いかと思いますが、Snowflake in Streamlit が出来たことで、エンドツーエンドでの機械学習などが可能にもなるようです。

(データの移動がなくSnowflakeの環境のみでデータの前処理から学習、結果の表示までができる)

せっかくなのでもう少し触ってみよう

DataMarketPlaceから良さげなものを探します。

BuiltWith Pty Ltd 様が公開されている、 Top 10,000 Websites Technology Usage を利用させてもらいましょう。

インターネット上の上位10,000のウェブサイトの現在および過去の技術使用状況などの情報が入ったデータセットになっています。

試しに簡単なグラフを描画。

# Import python packages
import streamlit as st
from snowflake.snowpark.context import get_active_session
import altair as alt
import pandas as pd

st.set_page_config(layout="wide")
# Display header
st.header("サンプルアプリケーション")

# Get the current credentials
session = get_active_session()

def get_data():
    query = """
    WITH TARGET_DATA AS (
        SELECT
        MAJOR_CATEGORY, DATE_TRUNC('month', FIRST_DETECTED) AS FIRST_DETECTED_MONTH
        FROM TOP_10000_WEBSITES_TECHNOLOGY_USAGE.TECHDATA.WEBSITE_TECH
    )
    SELECT MAJOR_CATEGORY, FIRST_DETECTED_MONTH, COUNT(*) AS COUNT FROM TARGET_DATA GROUP BY 1,2 ORDER BY FIRST_DETECTED_MONTH;
    """
    tech_history = session.sql(query).to_pandas()
    return tech_history
    
source = get_data()


c = alt.Chart(source).mark_bar().encode(
    x='FIRST_DETECTED_MONTH',
    y='COUNT',
    color='MAJOR_CATEGORY',
    tooltip=['FIRST_DETECTED_MONTH', 'COUNT', 'MAJOR_CATEGORY']
)

st.altair_chart(c, use_container_width=True)

うーん環境構築しなくていいのはとても楽ですね...

今後

ロードマップとしては 今後は下記のようなことを想定しているとのこと

  • CRUD ++
  • Streamlit LLM
  • カスタムコンポーネント
  • コラボレーションのためのプライベートワークスペース
  • CI/CD
  • Git統合
  • MLサービスの呼び出し
  • 行レベルのアクセス制御

注意点

  • 現状はまだPublicPreviewの段階、エラーなどが起きる可能性はあるので本番稼働はGAを待ってからの方が良さそう
  • SISで利用するWHは最低でも15分は稼働する状態になっています、なのでその辺りの挙動はちゃんと理解して利用する必要がある

終わりに

Streamlit in Snowflake を触ってみましたが、簡単な可視化であればSnowflake上でパパッと終わらせることができるのはとても良いなと感じました。(もちろん複雑なものも可能)

また権限関係などもSnowflakeロールベースアクセスモデルを利用できるのでその辺りの対応も出来るのもありがたい。

今後のロードマップにあるようなCRUD関連やCI/CD、Git統合などが実現されればより開発スピードを上げることができそうだなと思いました。