Skip to content

yggdrasil.databricks.catalog / schema / table / column

Unity Catalog resource singletons. Catalog, Schema (UCSchema), Table, and Column wrap the corresponding UC entities — singleton-cached per identity, TTL-aware metadata, DDL helpers, and dict-style navigation.

All four are reachable from DatabricksClient without importing the sub-packages directly.

One-liners

from yggdrasil.databricks import DatabricksClient

catalog = DatabricksClient().catalogs["main"]
schema  = DatabricksClient().catalogs["main"]["default"]
table   = DatabricksClient().catalogs["main"]["default"]["orders"]

Catalog

from yggdrasil.databricks import DatabricksClient

client = DatabricksClient()
catalogs = client.catalogs

# Lookup
main = catalogs.catalog("main")        # or catalogs["main"]

# Metadata
print(main.full_name())                # "main"
print(main.owner)                      # "admin@example.com"
print(main.comment)                    # optional description
print(main.explore_url)                # Databricks UI URL

# Iterate schemas
for schema in main.schemas():
    print(schema.full_name())

# Create / ensure
from yggdrasil.databricks.catalog import Catalog
cat = Catalog(client=client, name="analytics")
cat.create(missing_ok=True, comment="Analytics catalog")

# Check existence
print(cat.exists())

# Delete
cat.delete(if_exists=True)

Schema

from yggdrasil.databricks import DatabricksClient

client = DatabricksClient()
schema = client.catalogs.schema("main.default")   # or client.catalogs["main"]["default"]

# Metadata
print(schema.full_name())         # "main.default"
print(schema.catalog_name)        # "main"
print(schema.owner)

# Iterate tables
for table in schema.tables():
    print(table.full_name())

# Create / ensure
schema.create(missing_ok=True, comment="Raw landing zone")
print(schema.exists())
schema.delete(if_exists=True)

Table

from yggdrasil.databricks import DatabricksClient
import pyarrow as pa

client = DatabricksClient()

# Lookup
orders = client.catalogs["main"]["sales"]["orders"]
# or
orders = client.tables.find_table("main.sales.orders")

# Metadata
print(orders.full_name())              # "main.sales.orders"
print(orders.catalog_name)            # "main"
print(orders.schema_name)             # "sales"
print(orders.owner)
print(orders.storage_location)        # Delta path
print(orders.data_source_format)      # "DELTA"
print(orders.exists())

# Create from Arrow schema
schema = pa.schema([
    pa.field("id",       pa.int64(),   nullable=False),
    pa.field("amount",   pa.float64()),
    pa.field("placed_at", pa.timestamp("us", tz="UTC")),
])
orders.create(schema=schema, missing_ok=True, comment="Sales orders")

# Truncate / delete
orders.truncate()
orders.delete(if_exists=True)

# Read Arrow batches (uses SQL under the hood)
for batch in orders.read_arrow_batches():
    print(batch.num_rows)

# Write Arrow table (appends by default)
arrow_table = pa.table({"id": [1], "amount": [99.50], "placed_at": [...]})
orders.write_arrow_table(arrow_table)

Column

from yggdrasil.databricks import DatabricksClient

client = DatabricksClient()
columns = client.catalogs["main"]["sales"]["orders"].columns()

for col in columns:
    print(col.name, col.type_name, col.nullable)

# Lookup a single column
col = client.columns.find_column("main.sales.orders", "amount")
print(col.comment)

Dict-style navigation

from yggdrasil.databricks import DatabricksClient

client = DatabricksClient()

# Full path in one expression
table = client.catalogs["main"]["sales"]["orders"]

# List all tables in a schema
for tbl in client.catalogs["main"]["sales"]:
    print(tbl.full_name())

# Tables service
tables_svc = client.tables
print(list(tables_svc.list_tables("main.sales")))

Constraints

from yggdrasil.databricks import DatabricksClient

client = DatabricksClient()
constraints = client.constraints          # TableConstraints service

# Add a primary-key constraint
constraints.add_primary_key("main.sales.orders", columns=["id"])

# Add a foreign-key constraint
constraints.add_foreign_key(
    "main.sales.order_lines",
    columns=["order_id"],
    references="main.sales.orders(id)",
)

# Drop a named constraint
constraints.drop_constraint("main.sales.order_lines", name="fk_order")