Skip to main content

databricks360

Installs Databricks course lab environments — notebooks, catalogs, datasets and governance objects — into your own workspace.

Modelled on dbdemos: you run it inside a Databricks notebook, so databricks-sdk picks up the notebook's own identity. There is no host, token or profile to configure.

Install

Not on PyPI yet, so install from the repo. In a Databricks notebook:

%pip install git+https://github.com/databrickslms/dbxdemos.git
dbutils.library.restartPython()

Once published, that becomes %pip install databricks360.

To pin a version, append a tag or commit:

%pip install git+https://github.com/databrickslms/dbxdemos.git@v0.1.0

Usage

import databricks360 as academy

academy.list_courses()
academy.install('genie-agents')

install writes the lab notebooks into your workspace and prints the run order. Then you open them and run each in turn.

Installed 'genie-agents' → /Workspace/Users/you@corp.com/databricks360/genie-agents
  catalog: mfg    tier: small

  Run these in order:
    1. 01_catalog_and_schemas
    2. 02_dimensions
    3. 03_facts   (slow)

Options

academy.install(
    'genie-agents',
    path='/Workspace/Shared/labs',   # default: your home folder
    catalog='training_v2',           # default: the course's own catalog
    tier='large',                    # default: 'small'
    overwrite=True,                  # replace existing notebooks
)

Why it does not run the notebooks for you

dbdemos starts a job and loads the data on your behalf. This deliberately does not. Generating the data is the substance of Module 0 — the point is to watch a warehouse chew through 20M rows and see the flaws appear, not to have a finished catalog materialise. It also means nothing consumes your DBUs without you asking.

Regulated environments

A locked-down Unity Catalog is normal in a governed organisation, so the default assumes the least privilege that can still work: the lab lands in whatever current_catalog() returns, and nothing is created above schema level.

Notebook 01 opens by showing you exactly where that is:

SELECT current_catalog() AS default_catalog, current_schema() AS default_schema;

The four shapes

# 1. Default — current catalog, schemas core / ref / staging.
#    No CREATE CATALOG attempted. Table names are two-level (core.dim_date),
#    so SQL resolves the catalog itself.
academy.install('genie-agents')

# 2. A specific catalog you were granted. Adds USE CATALOG, still creates no catalog.
academy.install('genie-agents', catalog='main')

# 3. Create a catalog — opt in, only if you hold the privilege.
academy.install('genie-agents', catalog='mfg', create_catalog=True)

# 4. One schema you already own. Everything lands there.
academy.install('genie-agents', schema='training_you')
academy.install('genie-agents', catalog='main', schema='training_you')

create_catalog is off by default and raises if you pass it without a catalog name — current_catalog() exists by definition, so there would be nothing to create.

Passing schema assumes you cannot create that schema either, since that is the reason to reach for it. Override with create_schema=True if you can.

No CREATE VOLUME either

academy.install('genie-agents', schema='training_you', create_volume=False)

The volume only serves Agent mode over unstructured files (Modules 3 and 16). Skipping it costs those exercises and nothing else, and the notebook says so.

Why the single-schema case renames nothing

core holds the dimensions and facts, ref holds only the documents volume, and staging holds only the two decoy tables. The three sets of object names do not overlap, so collapsing them into one schema is safe — and notebooks 02 onward resolve their own paths, so they need no changes whichever layout you chose.

What you get back

install reports the resolved layout and anything it declined to create, so a restricted install is visible rather than quietly partial:

Installed 'genie-agents' → /Workspace/Users/you@corp.com/databricks360/genie-agents
  tier: small
  single schema: current_catalog().training_you
  skipping: CREATE SCHEMA, CREATE VOLUME

Unity Catalog is required. Genie Agents read Unity Catalog objects, so hive_metastore will not work as the target catalog.

Tiers

Tier Transactions Use
small 20M default. Every module except 13
large 900M Module 13 (latency) only. Left unclustered on purpose

Start small. The large tier exists because you cannot measure query latency on a toy dataset, and nowhere else needs it.

Adding a course

Each course is a subpackage under databricks360/courses/:

databricks360/courses/<course_id>/
  __init__.py
  manifest.json      # title, default catalog, tiers, notebooks in run order
  *.sql              # synced from content/courses/<id>/assets/lab/

Placeholders available in the SQL: {{CATALOG}}, plus anything declared under a tier's values (currently {{TXN_COUNT}}). An unresolved placeholder raises rather than silently rendering empty.

Dataset documentation lives in docs/.

Publishing

Releases go to PyPI via Trusted Publishing — GitHub Actions authenticates to PyPI with a short-lived OIDC identity, so no API token exists in repo secrets or on anyone's laptop. A leaked token is the usual way a package supply chain gets compromised; the safest token is one that was never created.

One-time PyPI setup

  1. Sign in at pypi.orgYour account → Publishing

  2. Under Add a new pending publisher, choose GitHub and enter exactly:

    Field Value
    PyPI Project Name databricks360
    Owner databrickslms
    Repository name dbxdemos
    Workflow name publish.yml
    Environment name pypi
  3. In GitHub → Settings → Environments → New environment → name it pypi. Add yourself as a required reviewer if you want to approve each release.

"Pending" publisher is correct — the project does not exist on PyPI yet, and the first successful run creates it.

Cutting a release

# bump version in pyproject.toml, commit, then:
git tag v0.1.0
git push origin v0.1.0

The workflow runs the tests, builds, checks the tag matches pyproject.toml, and publishes. A mismatched tag fails before anything reaches the index — versions on PyPI are immutable, so a wrong number cannot be taken back, only yanked.

Publishing by hand instead

python -m pip install build twine
python -m build
twine check dist/*
twine upload dist/*          # prompts for an API token

Test it against TestPyPI first if you want a dry run: twine upload --repository testpypi dist/*.

Tests

python3 run_tests.py

Eleven tests, no workspace required: manifest loading, notebook cell structure, catalog substitution, tier switching, unresolved-placeholder detection, and a dry_run install. It also asserts the flaw-teaching column comments survive into the generated notebooks — those comments are the curriculum, so losing them in rendering would be a silent failure.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

databricks360-0.3.0.tar.gz (25.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

databricks360-0.3.0-py3-none-any.whl (24.1 kB view details)

Uploaded Python 3

File details

Details for the file databricks360-0.3.0.tar.gz.

File metadata

  • Download URL: databricks360-0.3.0.tar.gz
  • Upload date:
  • Size: 25.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for databricks360-0.3.0.tar.gz
Algorithm Hash digest
SHA256 614167a1c06f29dfc3449d4707c889a110ab8815a47b3321c07a5f38486eea21
MD5 a67008b66056e84485c286fc94810093
BLAKE2b-256 3202cac8abf396548f32f62782a85dc38ec44664d6242ba87f3ab3d9df40a51c

See more details on using hashes here.

File details

Details for the file databricks360-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: databricks360-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 24.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for databricks360-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8f3f3070514344662941576a0b1ba971d7bbbdb7c819d37c2e7ad3f1c03461b7
MD5 09a97ced6dbdf7893a288c496a91bfba
BLAKE2b-256 16eecb7e1754606a97a0362e9311a5471d16f9ea7dd39f15b15140f8ab31a0f4

See more details on using hashes here.

Release history Release notifications | RSS feed

0.7.0

2 files

0.6.3

2 files

0.6.2

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

This release

0.3.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page