Erste Schritte mit Streamlit in Snowflake

Unter diesem Thema erhalten Sie eine Einführung in die Verwendung von Streamlit in Snowflake.

Voraussetzungen für die Verwendung von Streamlit in Snowflake

Um Streamlit in Snowflake zu verwenden, müssen Sie die folgenden Voraussetzungen erfüllen:

Erforderliche Berechtigungen zum Erstellen und Verwenden einer Streamlit-App

Innerhalb von Streamlit in Snowflake ist eine Streamlit-App ein sicherungsfähiges Objekt, das dem Snowflake-Framework für die Zugriffssteuerung unterliegt. Streamlit-Apps verwenden ein Berechtigungsmodell, das auf Eigentümerrechten basiert. Weitere Informationen dazu finden Sie unter Erläuterungen zu Eigentümerrechten und Streamlit in Snowflake-Apps.

Ein App-Editor und der Eigentümer des Schemas, das die Streamlit-App enthält, können festlegen, welche Rollen die App verwenden dürfen. Benutzer können mit der App interagieren und alles sehen, was die Streamlit-App anzeigt. Benutzer haben die gleiche Ansicht der App wie der Eigentümer.

Weitere Informationen dazu finden Sie unter Freigabe einer Streamlit-App.

Erforderliche Berechtigungen zum Erstellen einer Streamlit-App

Streamlit-Apps sind Objekte auf Schemaebene.

Um eine Streamlit-App mit Streamlit in Snowflake zu erstellen und zu bearbeiten, müssen Sie eine Rolle verwenden, die entweder die Berechtigung OWNERSHIP für das Schema oder die folgenden Berechtigungen haben:

  • Für die Datenbank, die die Streamlit-App enthält:

    • USAGE

  • Für das Schema, das die Streamlit-App enthält:

    • USAGE

    • CREATE STREAMLIT

    • CREATE STAGE

Verwenden Sie den Befehl GRANT <Berechtigungen>, um einer Rolle diese Berechtigungen zu erteilen, wie in den folgenden Beispielen gezeigt:

GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
GRANT USAGE ON DATABASE streamlit_db 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

Wenn eine zukünftige Berechtigungszuweisung für die Datenbank oder das Schema definiert ist, stellen Sie sicher, dass der Benutzer die Streamlit-App mit der in der zukünftigen Berechtigungszuweisung definierten Rolle erstellt wird.

Erforderliche Berechtigungen zum Anzeigen einer Streamlit-App

Um eine Streamlit-App anzuzeigen, müssen Sie ein Snowflake-Konto haben und angemeldet sein. Sie müssen außerdem eine Rolle verwenden, die die Berechtigung USAGE für folgende Objekte hat:

  • Die Datenbank, die die Streamlit-App enthält

  • Das Schema, das die Streamlit-App enthält

  • Das Warehouse, in dem die Streamlit-App ausgeführt wird.

  • Die Streamlit-App

Wenn der App-Eigentümer eine Streamlit-App für eine andere Rolle freigibt, wird die USAGE-Berechtigung in den meisten Fällen der neuen Rolle automatisch zugewiesen. Wenn jedoch eine Streamlit-App in einem Schema mit MANAGED ACCESS erstellt wird, muss der neuen Rolle die USAGE-Berechtigung manuell zugewiesen werden.

Der Schemaeigentümer oder ein Benutzer mit der Rolle mit MANAGE GRANTS-Berechtigung für das Schema muss die USAGE-Berechtigung mit dem GRANT <Berechtigungen>-Befehl zuweisen, wie in den folgenden Beispielen gezeigt:

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 WAREHOUSE streamlit_wh TO ROLE streamlit_role;
GRANT USAGE ON STREAMLIT streamlit_db.streamlit_schema.streamlit_app TO ROLE streamlit_role;
Copy

Unterstützte Versionen der Streamlit-Bibliothek

Streamlit in Snowflake unterstützt die folgenden Versionen der Streamlit-Open-Source-Bibliothek:

  • 1.35.0

  • 1.31.1

  • 1.29.0

  • 1.26.0

  • 1.22.0

Versionshinweise zu den einzelnen Versionen finden Sie unter Änderungsprotokoll der Streamlit-Bibliothek. Beachten Sie, dass einige Features der Open-Source-Streamlit-Bibliothek in Streamlit in Snowflake nicht unterstützt werden. Siehe Nicht unterstützte Streamlit-Features.

Version der Streamlit-Bibliothek auswählen

Für jede Streamlit in Snowflake-App können Sie die Version der Streamlit-Bibliothek in auswählen Snowsight oder die Version in der Datei der App environment.yml festlegen. Wenn Sie die Version nicht festlegen, wird die letzte verfügbare Version verwendet.

Snowflake empfiehlt, eine Version von Streamlit anzuheften, um zu verhindern, dass die App aktualisiert wird, wenn eine neue Version von Streamlit im Snowflake-Anaconda-Kanal verfügbar wird.

Unterstützte externe Pakete

Standardmäßig enthält Streamlit in Snowflake die Pakete python, streamlit und snowflake-snowpark-python, die in Ihrer Umgebung vorinstalliert sind. Die Umgebung hat auch Zugriff auf die von diesen Paketen benötigten Abhängigkeiten.

Streamlit in Snowflake-Apps werden in Python 3.8 ausgeführt.

Sie können zusätzliche Pakete in Ihrer Streamlit-App installieren. Eine Liste der unterstützten Pakete finden Sie im Snowflake Anaconda Channel.

Unter den folgenden Themen finden Sie Informationen zum Einbinden eines unterstützten Pakets in Ihre Streamlit-App:

Richtlinien für die Auswahl eines Warehouses in Streamlit in Snowflake

Wenn Sie eine Streamlit-App in Streamlit in Snowflake ausführen, können sich mehrere Faktoren auf die Leistung auswirken, darunter die Komplexität der Streamlit-App, die Verfügbarkeit von Warehouses, die Latenz und die Kosten. Die folgenden Abschnitte enthalten allgemeine Richtlinien für die Verwendung von virtuellen Warehouses in Streamlit in Snowflake.

Kleinere Warehouses nutzen

Wenn Sie eine Streamlit-App in Streamlit in Snowflake ausführen, sollten Sie das kleinstmögliche Warehouse auswählen.

Während der Ausführung verwaltet ein Warehouse einen Cache der von einer Streamlit-App verwendeten Python-Pakete. Das Zwischenspeichern von Python-Paketen verbessert die Leistung beim späteren Laden von Apps, indem die zwischengespeicherte Version eines Pakets verwendet wird, anstatt die Pakete erneut herunterzuladen. Der Cache wird entfernt, wenn das Warehouse angehalten wird, was dazu führen kann, dass die App nach dem Fortsetzen des Warehouses zunächst langsamer geladen wird. Wenn das fortgesetzte Warehouse läuft und mehr Apps ausführt, wird der Paket-Cache neu aufgebaut, und die Apps, die den Cache nutzen können, erfahren eine verbesserte Leistung beim Laden.

Beachten Sie, dass die sekundengenaue Credit-Abrechnung und die automatische Aussetzung die Flexibilität bieten, mit kleineren Warehouses zu beginnen und dann die Größe des Warehouses an den Workload der Streamlit-App anzupassen. Sie können jederzeit die Größe eines Warehouse verringern. Weitere Informationen dazu finden Sie unter Das Warehouse einer Streamlit-App ändern.

Verwenden von dedizierten Warehouses

Wenn Sie Streamlit in Snowflake verwenden, empfiehlt Snowflake die Verwendung eines dedizierten Warehouses für die Ausführung von Streamlit-Apps. So können Sie die Kosten für das Ausführen einer Streamlit-App isolieren. Ein dediziertes Warehouse kann auch die Ladezeit der App verbessern, da das Warehouse keine anderen Workloads verwalten muss.

Weitere Informationen dazu finden Sie unter Hinweise zu Warehouses.

Tipp

Um während der Initialisierung das Anhalten des Warehouses zu vermeiden, müssen Sie das automatische Anhalten auf ein Minimum von 30 Sekunden einstellen.

Separates Warehouse zum Ausführen von Abfragen verwenden

Streamlit-Apps verwenden ein virtuelles Warehouse, um die App und deren Abfragen auszuführen. Fortgeschrittene Apps und Anwendungsfälle können komplexere Abfragen beinhalten, die ein größeres Warehouse erfordern.

Streamlit in Snowflake unterstützt den Befehl USE WAREHOUSE, der ein aktuelles Warehouse für die Sitzung angibt. Auf diese Weise können Sie die App mit einem X-Small-Warehouse und komplexe Abfragen mit einem größeren Warehouse ausführen.

Sie können wie folgt ein separates Warehouse verwenden, um Abfragen einer Streamlit-App auszuführen:

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

Bemerkung

Das Warehouse wird nur für die Dauer der Abfrage verwendet.

Erstellen Sie Ihre erste Streamlit in Snowflake-App

So erstellen Sie Ihre erste Streamlit in Snowflake-App:

  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie im Navigationsmenü die Option Projects » Streamlit aus.

  3. Wählen Sie + Streamlit App aus.

  4. Geben Sie einen Titel für die Anwendung ein und wählen Sie eine Datenbank, ein Schema und ein Warehouse.

  5. Wählen Sie Create aus.

Zugriff auf Snowflake-Daten in Ihrer Streamlit in Snowflake-App

In diesem Abschnitt bearbeiten Sie die Streamlit-App, die Sie gerade erstellt haben, um auf Daten aus einer Snowflake-Tabelle zuzugreifen.

  1. Erstellen Sie eine BUG_REPORT_DATA-Tabelle in Ihrer Datenbank und Ihrem Schema:

    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. Fügen Sie der BUG_REPORT_DATA-Tabelle Beispieldaten hinzu:

    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. Bearbeiten Sie den Code der Streamlit-App mit dem folgenden Beispiel:

    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 occured: {e}")
    
    expander = st.expander("See 100 most recent records")
    with expander:
        st.dataframe(get_data(session))
    
    Copy
  4. Wählen Sie Run, um die Streamlit-App auszuführen.