Streamlit in Snowflake 入門¶
このトピックでは、 Streamlit in Snowflake の使い始め方について説明します。
Streamlit in Snowflake を使用するための前提条件¶
Streamlit in Snowflake を使用するには、以下の前提条件を満たしている必要があります。
Streamlitアプリの作成と使用に必要な権限 があること。
Streamlit in Snowflake の Mapbox、およびAnacondaが提供するパッケージを使用するには、 外部製品規約 を確認する必要があります。
これらのパッケージの使用に関する情報については、 Anacondaからのサードパーティパッケージの使用 を参照してください。
*.snowflake.appがネットワークで許可リストに登録され、アプリが Snowflake に接続できることを確認してください。詳細については、 Streamlitアプリをロードできない をご参照ください。
Streamlitアプリの作成と使用に必要な権限¶
Streamlit in Snowflake 内では、Streamlitアプリは、 Snowflake アクセス制御フレームワーク に準拠するセキュリティ保護可能なオブジェクトです。Streamlitアプリは、所有者の権限に基づく権限モデルを使用しています。詳細については、 所有者の権利と Streamlit in Snowflake アプリの理解 をご参照ください。
アプリ編集者とStreamlitアプリを含むスキーマの所有者は、アプリの使用権限を持つロールを決定できます。ユーザーはアプリと対話することができ、Streamlitアプリが表示するものをすべて見ることができます。ユーザーには、所有者と同じアプリのビューが見えます。
詳細については、 Streamlitアプリを共有する をご参照ください。
Streamlitアプリの作成に必要な権限¶
Streamlitアプリはスキーマレベルのオブジェクトです。
Streamlit in Snowflake を使用してStreamlitアプリを作成および編集するには、スキーマの OWNERSHIP 権限、または以下の権限の両方を持つロールを使用する必要があります。
Streamlitアプリを含むデータベースに対する付与:
USAGE
Streamlitアプリを含むスキーマに対する付与:
USAGE
CREATE STREAMLIT
また、Streamlit アプリの実行に使用するウェアハウスで USAGE 権限を持っている必要があります。
この例に示すように、 GRANT <権限> ... TO ROLE コマンドを使用して、これらの権限をロールに付与します。
GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator; GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_creator; GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_creator; GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
フューチャーグラントがデータベースまたはスキーマに定義されている場合、ユーザーがフューチャーグラントに定義されているロールを使用してStreamlitアプリを作成するようにしてください。
Streamlitアプリの表示に必要な権限¶
Streamlitアプリを表示するには、Snowflakeアカウントを持っており、サインインしている必要があります。さらに、以下のオブジェクトに USAGE 権限を付与されたロールを使用する必要があります。
Streamlitアプリを含むデータベース
Streamlitアプリを含むスキーマ
Streamlitアプリ
ほとんどの場合、アプリ所有者が他のロールとStreamlitアプリを共有すると、 USAGE 権限は自動的に新しいロールに付与されます。ただし、 MANAGED ACCESS を持つスキーマでStreamlitアプリが作成された場合は、 USAGE 権限を新しいロールに手動で付与する必要があります。
スキーマ所有者または MANAGE GRANTS 権限を持つロールを持つユーザーは、この例に示すように GRANT <権限> ... TO ROLE コマンドを使用して USAGE 権限を付与する必要があります。
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_role;
GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_role;
GRANT USAGE ON STREAMLIT streamlit_db.streamlit_schema.streamlit_app TO ROLE streamlit_role;
スキーマ所有者、または MANAGE GRANTS 権限を持つロールを持つユーザーは、この例に示すように、スキーマに作成された Streamlit アプリケーショ ンをすべて表示する USAGE 権限を付与することができます。
GRANT USAGE ON FUTURE STREAMLITS IN SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_role;
サポートされているStreamlitライブラリのバージョン¶
Streamlit in Snowflake は、次のバージョンのStreamlitオープンソースライブラリをサポートしています。
1.46.1
1.45.1
1.44.0
1.42.0
1.39.0
1.35.0
1.31.1
1.29.0
1.26.0
1.22.0
各バージョンのリリースノートを表示するには、 Streamlitライブラリの変更ログ をご参照ください。オープンソースStreamlitライブラリのいくつかの機能は、 Streamlit in Snowflake ではサポートされていないことに注意してください。サポートされていないStreamlit機能 をご参照ください。
Streamlitライブラリのバージョンを選択する¶
各 Streamlit in Snowflake アプリについて、 Snowsight にある Streamlitライブラリバージョンを選択する か、アプリの environment.yml ファイルにある バージョンを固定します。バージョンを固定しない場合は、利用可能な最新バージョンが使用されます。
Snowflake Anaconda Channel で Streamlit の新バージョンが利用可能になったときにアプリがアップグレードされないように、Streamlit のバージョンを固定することをお勧めします。
サポートされている外部パッケージ¶
デフォルトでは、 Streamlit in Snowflake には python、 streamlit、 snowflake-snowpark-python パッケージがプレインストールされています。環境には、これらのパッケージが必要とする依存関係に対するアクセスもあります。
新規作成の Streamlit in Snowflake アプリは、デフォルトでPython 3.11で実行されます。
Streamlit in Snowflake apps also support Python 3.10. You can either pin the Python version in the environment.yml
file or choose the version in the Streamlit editor in Snowsight by selecting Packages.
Streamlitアプリに追加パッケージをインストールすることができます。サポートされるパッケージのリストについては、 Snowflake Anaconda Channel を参照してください。
Streamlit アプリにサポートされているパッケージを含めるための情報については、以下のトピックをご参照ください。
Streamlit in Snowflake でのウェアハウス選択のガイドライン¶
Streamlit in Snowflake でStreamlitアプリを実行する場合、Streamlitアプリの複雑さ、ウェアハウスの可用性、遅延、コストなど、複数の要因がパフォーマンスに影響する可能性があります。以下のセクションでは、 Streamlit in Snowflake で仮想ウェアハウスを使用するための一般的なガイドラインを示します。
小規模なウェアハウスを使用する¶
Streamlit in Snowflake でStreamlitアプリを実行する場合、可能な限り小さなウェアハウスを選択する必要があります。
実行中、ウェアハウスはStreamlitアプリが使用するPythonパッケージのキャッシュを維持します。Pythonパッケージのキャッシュは、パッケージを再度ダウンロードする代わりにキャッシュされたバージョンのパッケージを使用することで、後でアプリをロードする際のパフォーマンスを向上させます。 キャッシュはウェアハウスが中断されると削除されるため、ウェアハウス再開後のアプリの初期読み込みが遅くなる可能性があります。再開されたウェアハウスでより多くのアプリが実行されると、パッケージキャッシュが再構築され、キャッシュを利用できるアプリではアプリのロードパフォーマンスが向上します。
秒単位のクレジット請求と自動サスペンドにより、小規模なウェアハウスから始めて、Streamlitアプリの作業負荷に合わせてウェアハウスのサイズを調整する柔軟性が得られます。ウェアハウスのサイズはいつでも縮小できます。詳細については、 Streamlitアプリのウェアハウスを変更する をご参照ください。
専用のウェアハウスを使用する¶
Streamlit in Snowflake を使用する場合、Snowflake は Streamlit アプリ実行専用のウェアハウスの使用を推奨します。これにより、Streamlitアプリの運営コストを切り分けることができます。専用ウェアハウスは、ウェアハウスが他のワークロードを管理する必要がないため、アプリのロード時間も短縮できます。
詳細については、 ウェアハウスに関する考慮事項 をご参照ください。
Tip
初期化中にウェアハウスの中断を避けるため、自動中断を最小30秒に設定することを検討してください。
別のウェアハウスを使用してクエリを実行する¶
Streamlitアプリは、仮想ウェアハウスを使用してアプリとそのクエリを実行します。より高度なアプリやユースケースでは、複雑なクエリの実行が必要になる場合があり、より大規模なウェアハウスが必要になります。
Streamlit in Snowflake は、セッションの現在のウェアハウスを指定する USE WAREHOUSE コマンドをサポートしています。このコマンドを使用すると、X-Smallウェアハウスを使用してアプリを実行し、より大きなウェアハウスを使用して複雑なクエリを実行できます。
このコードを使って、Streamlitアプリでクエリを実行するために別のウェアハウスを使用することができます。
import streamlit as st
from snowflake.snowpark.context import get_active_session
# Get the current credentials
session = get_active_session()
warehouse_sql = f"USE WAREHOUSE LARGE_WH"
session.sql(warehouse_sql).collect()
# Execute the SQL using a different warehouse
sql = """SELECT * from MY_DB.INFORMATION_SCHEMA.PACKAGES limit 100"""
session.sql(sql).collect()
注釈
ウェアハウスはクエリの実行期間中のみ使用されます。
最初の Streamlit in Snowflake アプリをビルドする¶
Snowsight にサインインします。
ナビゲーションメニューで Projects » Streamlit を選択します。
+ Streamlit App を選択します。
アプリのタイトルを入力し、データベース、スキーマ、ウェアハウスを選択します。
Create を選択します。
Streamlit in Snowflake アプリでSnowflakeデータにアクセスする¶
このセクションでは、新しいStreamlitアプリを編集して、Snowflakeテーブルからデータにアクセスします。
データベースとスキーマに
BUG_REPORT_DATAテーブルを作成します。CREATE OR REPLACE TABLE <your_database>.<your_schema>.BUG_REPORT_DATA ( AUTHOR VARCHAR(25), BUG_TYPE VARCHAR(25), COMMENT VARCHAR(100), DATE DATE, BUG_SEVERITY NUMBER(38,0) );
BUG_REPORT_DATAテーブルにサンプルデータを追加します。INSERT INTO <your_database>.<your_schema>.BUG_REPORT_DATA (AUTHOR, BUG_TYPE, COMMENT, DATE, BUG_SEVERITY) VALUES ('John Doe', 'UI', 'The button is not aligned properly', '2024-03-01', 3), ('Aisha Patel', 'Performance', 'Page load time is too long', '2024-03-02', 5), ('Bob Johnson', 'Functionality', 'Unable to submit the form', '2024-03-03', 4), ('Sophia Kim', 'Security', 'SQL injection vulnerability found', '2024-03-04', 8), ('Michael Lee', 'Compatibility', 'Does not work on Internet Explorer', '2024-03-05', 2), ('Tyrone Johnson', 'UI', 'Font size is too small', '2024-03-06', 3), ('David Martinez', 'Performance', 'Search feature is slow', '2024-03-07', 4), ('Fatima Abadi', 'Functionality', 'Logout button not working', '2024-03-08', 3), ('William Taylor', 'Security', 'Sensitive data exposed in logs', '2024-03-09', 7), ('Nikolai Petrov', 'Compatibility', 'Not compatible with Safari', '2024-03-10', 2);
Streamlitアプリのコードを編集します。
import streamlit as st st.set_page_config(page_title="Bug report", layout="centered") session = st.connection('snowflake').session() # Change the query to point to your table def get_data(_session): query = """ select * from <your_database>.<your_schema>.BUG_REPORT_DATA order by date desc limit 100 """ data = _session.sql(query).collect() return data # Change the query to point to your table def add_row_to_db(session, row): sql = f"""INSERT INTO <your_database>.<your_schema>.BUG_REPORT_DATA VALUES ('{row['author']}', '{row['bug_type']}', '{row['comment']}', '{row['date']}', '{row['bug_severity']}')""" session.sql(sql).collect() st.title("Bug report demo!") st.sidebar.write( f"This app demos how to read and write data from a Snowflake Table" ) form = st.form(key="annotation", clear_on_submit=True) with form: cols = st.columns((1, 1)) author = cols[0].text_input("Report author:") bug_type = cols[1].selectbox( "Bug type:", ["Front-end", "Back-end", "Data related", "404"], index=2 ) comment = st.text_area("Comment:") cols = st.columns(2) date = cols[0].date_input("Bug date occurrence:") bug_severity = cols[1].slider("Bug priority :", 1, 5, 2) submitted = st.form_submit_button(label="Submit") if submitted: try: add_row_to_db( session, {'author':author, 'bug_type': bug_type, 'comment':comment, 'date':str(date), 'bug_severity':bug_severity }) st.success("Thanks! Your bug was recorded in the database.") st.balloons() except Exception as e: st.error(f"An error occurred: {e}") expander = st.expander("See 100 most recent records") with expander: st.dataframe(get_data(session))
Streamlitアプリを実行するには、 Run を選択します。