Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tutorial ini menunjukkan cara membuat aplikasi Databricks menggunakan Konektor SQL Databricks untuk Python dan Streamlit. Anda akan mempelajari cara mengembangkan aplikasi yang melakukan hal berikut:
- Membaca tabel Unity Catalog dan menampilkannya di antarmuka Streamlit.
- Mengedit data dan menulisnya kembali ke tabel.
Langkah 1: Mengonfigurasi hak istimewa
Contoh-contoh ini mengasumsikan bahwa aplikasi Anda menggunakan otorisasi aplikasi. Perwakilan layanan aplikasi Anda harus memiliki:
-
SELECThak akses pada tabel Unity Catalog -
MODIFYhak akses pada tabel Unity Catalog -
CAN USEhak istimewa pada gudang data SQL
Untuk informasi selengkapnya, lihat Referensi hak istimewa Katalog Unity dan ACL gudang SQL.
Langkah 2: Menginstal dependensi
Buat requirements.txt file dan sertakan paket berikut:
databricks-sdk
databricks-sql-connector
streamlit
pandas
Langkah 3: Mengonfigurasi eksekusi aplikasi
app.yaml Buat file untuk menentukan bagaimana aplikasi Anda dimulai di Azure Databricks Apps.
command: ['streamlit', 'run', 'app.py']
Langkah 4: Membaca tabel Katalog Unity
Contoh kode ini menunjukkan cara membaca data dari tabel Unity Catalog dan menampilkannya menggunakan Streamlit. Buat app.py file yang memenuhi tujuan berikut:
- Menggunakan autentikasi prinsipal layanan aplikasi.
- Meminta pengguna untuk jalur HTTP gudang SQL dan nama tabel Katalog Unity.
-
SELECT *Menjalankan kueri pada tabel yang ditentukan. - Menampilkan hasil dalam Streamlit
st.dataframe.
app.py
import pandas as pd
import streamlit as st
from databricks import sql
from databricks.sdk.core import Config
import os
cfg = Config()
# Use app service principal authentication
def get_connection(http_path):
server_hostname = cfg.host
if server_hostname.startswith('https://'):
server_hostname = server_hostname.replace('https://', '')
elif server_hostname.startswith('http://'):
server_hostname = server_hostname.replace('http://', '')
return sql.connect(
server_hostname=server_hostname,
http_path=http_path,
credentials_provider=lambda: cfg.authenticate,
_use_arrow_native_complex_types=False,
)
# Read data from a Unity Catalog table and return it as a pandas DataFrame
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()
# Use Streamlit input fields to accept user input
http_path_input = st.text_input(
"Enter your Databricks HTTP Path:", placeholder="/sql/1.0/warehouses/xxxxxx"
)
table_name = st.text_input(
"Specify a Unity Catalog table name:", placeholder="catalog.schema.table"
)
# Display the result in a Streamlit DataFrame
if http_path_input and table_name:
conn = get_connection(http_path_input)
df = read_table(table_name, conn)
st.dataframe(df)
else:
st.warning("Provide both the warehouse path and a table name to load data.")
Langkah 5: Edit tabel Katalog Unity
Contoh kode ini memungkinkan pengguna membaca, mengedit, dan menulis perubahan pada tabel Unity Catalog menggunakan fitur pengeditan data Streamlit. Tambahkan fungsionalitas berikut ke app.py file:
- Gunakan
INSERT OVERWRITEuntuk menulis data yang diperbarui kembali ke tabel.
app.py
import pandas as pd
import streamlit as st
from databricks import sql
from databricks.sdk.core import Config
import math
cfg = Config()
# Use app service principal authentication
def get_connection(http_path):
server_hostname = cfg.host
if server_hostname.startswith('https://'):
server_hostname = server_hostname.replace('https://', '')
elif server_hostname.startswith('http://'):
server_hostname = server_hostname.replace('http://', '')
return sql.connect(
server_hostname=server_hostname,
http_path=http_path,
credentials_provider=lambda: cfg.authenticate,
_use_arrow_native_complex_types=False,
)
# Read data from a Unity Catalog table and return it as a pandas DataFrame
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()
# Format values for SQL, handling NaN/None as NULL
def format_value(val):
if val is None or (isinstance(val, float) and math.isnan(val)):
return 'NULL'
else:
return repr(val)
# Use `INSERT OVERWRITE` to update existing rows and insert new ones
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(format_value, 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")
# Use Streamlit input fields to accept user input
http_path_input = st.text_input(
"Enter your Databricks HTTP Path:", placeholder="/sql/1.0/warehouses/xxxxxx"
)
table_name = st.text_input(
"Specify a Unity Catalog table name:", placeholder="catalog.schema.table"
)
# Display the result in a Streamlit DataFrame
if http_path_input and table_name:
conn = get_connection(http_path_input)
if conn:
st.success("✅ Connected successfully!")
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:
st.warning(f"⚠️ You have {len(df_diff) // 2} unsaved changes")
if st.button("Save changes"):
insert_overwrite_table(table_name, edited_df, conn)
st.rerun()
else:
st.warning("Provide both the warehouse path and a table name to load data.")
Langkah selanjutnya
- Sebarkan aplikasi ke ruang kerja Anda. Lihat Menyebarkan aplikasi Databricks.
- Membatasi akses ke pengguna yang sesuai. Lihat Mengonfigurasi izin untuk aplikasi Databricks.