Tutorial: Desenvolva um aplicativo Databricks com o Streamlit
Este tutorial mostra como criar um aplicativo Databricks usando o Databricks SQL Connector para Python e Streamlit. Você aprenderá a desenvolver um aplicativo que faça o seguinte:
- Lê uma tabela do Unity Catalog e a exibe em uma interface Streamlit.
- Edita os dados e os grava de volta na tabela.
Etapas :
- Etapa 1: Configurar privilégios
- Etapa 2: instalar dependências
- Etapa 3: Ler uma tabela do Unity Catalog
- Etapa 4: Editar uma tabela do Unity Catalog
- Passos seguintes
Etapa 1: Configurar privilégios
Esses exemplos pressupõem que seu aplicativo usa autorização de aplicativo. A entidade de serviço do seu aplicativo deve ter:
SELECT
privilégio na tabela do Unity CatalogMODIFY
privilégio na tabela do Unity CatalogCAN USE
privilégio sobre o SQL warehouse
Para obter mais informações, consulte Unity Catalog privileges and securable objects e SQL warehouse ACLs.
Etapa 2: instalar dependências
Inclua o seguinte pacote em seu arquivo requirements.txt:
databricks-sdk
databricks-sql-connector
streamlit
pandas
pandas
só é necessário se você estiver editando dados da tabela.
Etapa 3: Ler uma tabela do Unity Catalog
Este exemplo demonstra como ler dados de uma tabela do Unity Catalog e exibi-los usando o Streamlit. O aplicativo executa as seguintes etapas:
- Solicita ao usuário o caminho HTTP do SQL warehouse e o nome da tabela do Unity Catalog.
- Estabelece uma conexão SQL em cache usando o Databricks SQL Connector for Python.
- Executa uma consulta
SELECT *
na tabela especificada. - Exibe o resultado em um Streamlit
st.dataframe
.
app.py
import streamlit as st
from databricks import sql
from databricks.sdk.core import Config
cfg = Config() # Set the DATABRICKS_HOST environment variable when running locally
@st.cache_resource # connection is cached
def get_connection(http_path):
return sql.connect(
server_hostname=cfg.host,
http_path=http_path,
credentials_provider=lambda: cfg.authenticate,
)
def read_table(table_name, conn):
with conn.cursor() as cursor:
query = f"SELECT * FROM {table_name}"
cursor.execute(query)
return cursor.fetchall_arrow().to_pandas()
http_path_input = st.text_input(
"Enter your Databricks HTTP Path:", placeholder="/sql/1.0/warehouses/xxxxxx"
)
table_name = st.text_input(
"Specify a :re[UC] table name:", placeholder="catalog.schema.table"
)
if http_path_input and table_name:
conn = get_connection(http_path_input)
df = read_table(table_name, conn)
st.dataframe(df)
- Este exemplo usa
st.cache_resource
para armazenar em cache a conexão do banco de dados em sessões e reexecuções. - Use os campos de entrada Streamlit (
st.text_input
) para aceitar a entrada do usuário.
Etapa 4: Editar uma tabela do Unity Catalog
Este exemplo permite que os usuários leiam, editem e gravem alterações em uma tabela Unity Catalog usando o recurso de edição de dados do Streamlit. O aplicativo executa as seguintes etapas:
- Lê a tabela original em um Pandas DataFrame.
- Exibe a tabela em um editor Streamlit (
st.data_editor
). - Detecta alterações entre o DataFrames original e o editado.
- Usa
INSERT OVERWRITE
para gravar os dados atualizados de volta na tabela.
app.py
import pandas as pd
import streamlit as st
from databricks import sql
from databricks.sdk.core import Config
cfg = Config() # Set the DATABRICKS_HOST environment variable when running locally
@st.cache_resource
def get_connection(http_path):
return sql.connect(
server_hostname=cfg.host,
http_path=http_path,
credentials_provider=lambda: cfg.authenticate,
)
def read_table(table_name: str, conn) -> pd.DataFrame:
with conn.cursor() as cursor:
cursor.execute(f"SELECT * FROM {table_name}")
return cursor.fetchall_arrow().to_pandas()
def insert_overwrite_table(table_name: str, df: pd.DataFrame, conn):
progress = st.empty()
with conn.cursor() as cursor:
rows = list(df.itertuples(index=False))
values = ",".join([f"({','.join(map(repr, row))})" for row in rows])
with progress:
st.info("Calling Databricks SQL...")
cursor.execute(f"INSERT OVERWRITE {table_name} VALUES {values}")
progress.empty()
st.success("Changes saved")
http_path_input = st.text_input(
"Specify the HTTP Path to your Databricks SQL Warehouse:",
placeholder="/sql/1.0/warehouses/xxxxxx",
)
table_name = st.text_input(
"Specify a Catalog table name:", placeholder="catalog.schema.table"
)
if http_path_input and table_name:
conn = get_connection(http_path_input)
original_df = read_table(table_name, conn)
edited_df = st.data_editor(original_df, num_rows="dynamic", hide_index=True)
df_diff = pd.concat([original_df, edited_df]).drop_duplicates(keep=False)
if not df_diff.empty:
if st.button("Save changes"):
insert_overwrite_table(table_name, edited_df, conn)
else:
st.warning("Provide both the warehouse path and a table name to load data.")
- O aplicativo determina se as atualizações são necessárias calculando as diferenças entre as tabelas originais e editadas.
- Uma barra de progresso fornece feedback durante as operações de gravação usando
st.info
est.success
. - Essa abordagem substitui todas as linhas na tabela. Para atualizações parciais, use uma estratégia de gravação diferente.
Próximas etapas
- Implante o aplicativo em seu site workspace. Ver implantado a Databricks app.
- Restrinja o acesso aos usuários apropriados. Consulte Configurar permissões para seu aplicativo Databricks.