开始使用 Streamlit in Snowflake

本主题介绍如何开始使用 Streamlit in Snowflake。

使用 Streamlit in Snowflake 的先决条件

要使用 Streamlit in Snowflake,请确保满足以下先决条件:

创建和使用 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

    • CREATE STAGE

您还必须对用于运行 Streamlit 应用程序的仓库拥有 USAGE 权限。

使用 GRANT <privileges> 命令将这些权限授予角色,如以下示例所示:

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;
GRANT CREATE STAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
Copy

如果在数据库或架构上定义了未来授权,请确保用户使用未来授权中定义的角色创建 Streamlit 应用程序。

查看 Streamlit 应用程序所需的权限

要查看 Streamlit 应用程序,必须拥有 Snowflake 账户并已登录。此外,您必须使用被授予对以下对象 USAGE 权限的角色:

  • 包含 Streamlit 应用程序的数据库

  • 包含 Streamlit 应用程序的架构

  • Streamlit 应用程序

在大多数情况下,当应用程序所有者与其他角色共享 Streamlit 应用程序时, USAGE 权限将自动授予新角色。但是,如果在 MANAGED ACCESS 架构中创建 Streamlit 应用程序,则必须手动将 USAGE 权限授予新角色。

架构所有者或具有 MANAGE GRANTS 权限的角色的用户必须使用 GRANT <privileges> 命令授予 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;
Copy

受支持的 Streamlit 库版本

Streamlit in Snowflake 支持以下 Streamlit 开源库版本:

  • 1.35.0

  • 1.31.1

  • 1.29.0

  • 1.26.0

  • 1.22.0

要查看每个版本的版本说明,请参阅 Streamlit 库更改日志 (https://docs.streamlit.io/library/changelog)。请注意,Streamlit in Snowflake 中不支持开源 Streamlit 库的某些功能。请参阅 不支持的 Streamlit 功能

选择 Streamlit 库版本

对于每个 Streamlit in Snowflake 应用程序,您可以 在 |sf-web-interface| 中选择 Streamlit 库版本,也可以 将版本固定 在应用程序的 environment.yml 文件中。如果没有固定版本,则使用最新的可用版本。

Snowflake 建议固定 Streamlit 的某个版本,以防止当 Snowflake Anaconda 通道中发布新版本的 Streamlit 时,升级该应用程序。

支持的外部包

默认情况下,Streamlit in Snowflake 包含预先安装到环境中的 pythonstreamlitsnowflake-snowpark-python 包。环境还可以访问这些包所需的依赖项。

Streamlit in Snowflake 应用程序在 Python 3.8 中运行。

可以在 Streamlit 应用程序中安装其他包。有关受支持的包列表,请参阅 Snowflake Anaconda 通道 (https://repo.anaconda.com/pkgs/snowflake/)。

有关在 Streamlit 应用程序中包含支持的包的信息,请参阅以下主题:

在 Streamlit in Snowflake 中选择仓库的准则

在 Streamlit in Snowflake 内运行 Streamlit 应用程序时,多种因素可能会影响性能,包括 Streamlit 应用程序的复杂性、仓库的可用性、延迟和成本等。以下部分提供了在 Streamlit in Snowflake 内使用虚拟仓库的一般准则。

使用较小的仓库

在 Streamlit in Snowflake 内运行 Streamlit 应用程序时,应尽可能选择最小的仓库。

运行时,仓库会维护 Streamlit 应用程序使用的 Python 包的缓存。缓存 Python 包后,稍后加载应用程序时会使用包的缓存版本而不是重新下载包,因而相应提高了性能。 仓库暂停时会移除缓存,这可能会导致仓库恢复后应用程序的加载速度最初会变慢。随着已恢复的仓库运行更多应用程序,包缓存会被重建,因此,能够利用这些缓存的应用程序的加载性能会有所提升。

请注意,每秒 Credit 计费和自动暂停提供了灵活性,即开始时使用较小的仓库,然后按照 Streamlit 应用程序的工作负载来调整仓库的大小。可以随时增加仓库的大小。有关更多信息,请参阅 更改 Streamlit 应用程序的仓库

使用专用仓库

使用 Streamlit in Snowflake 时,Snowflake 建议使用专用仓库来运行 Streamlit 应用程序。这使您可以隔离 Streamlit 应用程序的运行成本。专用仓库还可以改善应用程序的加载时间,原因是其无需管理其他工作负载。

有关更多信息,请参阅 仓库注意事项

小技巧

为避免仓库在初始化过程中暂停,可考虑将自动暂停至少设置为 30 秒。

使用单独的仓库运行查询

Streamlit 应用程序使用虚拟仓库来运行应用程序及其查询。更高级的应用程序和用例可能需要运行复杂的查询,而这需要更大的仓库。

Streamlit in Snowflake 支持 USE WAREHOUSE 命令,该命令可为会话指定当前仓库。通过此命令,您可以使用 X-小型仓库运行应用程序,并使用较大的仓库处理复杂查询。

您可以使用以下代码,在 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()
Copy

备注

仓库仅在查询期间使用。

构建首个 Streamlit in Snowflake 应用程序

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Projects » Streamlit

  3. 选择 + Streamlit App

  4. 输入应用程序标题,并选择数据库、架构和仓库。

  5. 选择 Create

在 Streamlit in Snowflake 应用程序中访问 Snowflake 数据

在本节中,您可以编辑新的 Streamlit 应用程序以访问 Snowflake 表中的数据。

  1. 在数据库和架构中创建 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)
    );
    
    Copy
  2. 将样本数据添加到 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);
    
    Copy
  3. 编辑 Streamlit 应用程序代码:

    import streamlit as st
    
    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.set_page_config(page_title="Bug report", layout="centered")
    
    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))
    
    Copy
  4. 要运行 Streamlit 应用程序,请选择 Run

语言: 中文