Skip to main content

Read a Delta table

This recipe reads a Unity Catalog table using the Databricks SQL Connector.

Code snippet​

app.py
import reflex as rx
from databricks import sql
from databricks.sdk.core import Config
import logging
import pandas as pd
from typing import Any

_connection = None


def get_connection(http_path: str):
global _connection
if _connection:
return _connection
cfg = Config()
connection = sql.connect(
server_hostname=cfg.host,
http_path=http_path,
credentials_provider=cfg.authenticate,
)
_connection = connection
return connection


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 pandas_to_editor_format(
df: pd.DataFrame,
) -> tuple[list[list[Any]], list[dict[str, str]]]:
"""Convert a pandas DataFrame to the format required by rx.data_editor."""
if df.empty:
return ([], [])
data = df.values.tolist()
columns = [{"title": col, "id": col, "type": "str"} for col in df.columns]
return (data, columns)


class ReadTableState(rx.State):
http_path_input: str = ""
table_name: str = "samples.nyctaxi.trips"
df_data: list[list[Any]] = []
df_columns: list[dict] = []
is_loading: bool = False
error_message: str = ""

@rx.var
def columns_for_editor(self) -> list[dict]:
return self.df_columns

@rx.var
def data_for_editor(self) -> list[list[str]]:
"""Return data directly as it is already formatted for the editor."""
return self.df_data

@rx.event(background=True)
async def load_table(self):
async with self:
self.is_loading = True
self.error_message = ""
self.df_data = []
self.df_columns = []
http_path = self.http_path_input
table_name = self.table_name
if not http_path:
async with self:
self.error_message = "Please enter an HTTP Path."
self.is_loading = False
return
try:
conn = get_connection(http_path)
df = read_table(table_name, conn)
data, cols = pandas_to_editor_format(df)
async with self:
self.df_data = data
self.df_columns = cols
except Exception as e:
logging.exception(f"Error loading Delta table: {e}")
async with self:
self.error_message = f"Error: {e}"
finally:
async with self:
self.is_loading = False
info

This sample caches the SQL connection in a module-level _connection variable so it can be reused within the same app process. For multi-worker deployments, consider a proper pooling strategy or per-request connections depending on your workload.

Resources​

Permissions​

Your app service principal needs the following permissions:

  • SELECT on the Unity Catalog table
  • CAN USE on the SQL warehouse

See Unity Catalog privileges and securable objects for more information.

Dependencies​

requirements.txt
databricks-sdk
databricks-sql-connector
pandas
reflex