prizm-adls-scanner
Python package that runs Prizm Exception, Lookup, Comparison, Materialize, and Behavioral jobs inside a Databricks Spark cluster.
Location: prizm-cli/prizm-adls-scanner (under Server root)
What it is:
- ✅ A library imported inside a Databricks notebook or job task — it does not read files or connect to storage itself; it operates on an already-active
sparksession - ✅ Runtime deps are just
requestsandsqlglot—pysparkis intentionally not a dependency (Databricks already provides Spark on the cluster; installing PyPIpysparkthere would conflict with it) - ✅
pysparkis imported lazily inside each runner module, sopip install/import prizm_adls_scannersucceeds even outside Databricks (useful for local dev of non-Spark code paths)
What it is not:
- ❌ Not a CLI — no console script, no
argparse/clickentry point - ❌ Not a file scanner/connector — it has no ADLS/S3 I/O logic; it assumes data is already loaded into Spark by the notebook/job that calls it
- ❌ Not the metrics-collection scanner — that's a different, unrelated concern
Compiled Modules
databricks/comparison_driver.py, databricks/lookup_driver.py, and databricks/exception_runner.py — the comparison/reconciliation, lookup-matching, and exception-detection engines — ship as compiled Cython extensions (.so), not plain Python. Everything else (databricks/__init__.py, _runtime.py, exception_metadata_runner.py, materialize_runner.py, side_snapshot_runner.py, the thin *_runner.py wrappers) stays plain Python.
Consequences:
- The published wheels are
manylinuxonly, one per Python version (cp39–cp313) — built via cibuildwheel, see[tool.cibuildwheel]inpyproject.toml. They will not install on non-Linux platforms or Python versions outside that range. There is no sdist (an sdist is source-by-definition, which would defeat the point). - Building it yourself (
make build, or an editablepip install -e .) requires a C compiler andCython— both pulled in automatically as build-time dependencies, but you need a workingcc/gccon your machine. An editable install does not exercise the compiled build — it just points back at the source directory, so the protected modules stay fully readable in-place during local development. Protection only applies to what actually gets published.
Install
Databricks notebook
%pip install prizm-adls-scanner
dbutils.library.restartPython()
Cluster / job library (recommended for production)
Attach the published wheel as a cluster or job library so tasks don't need %pip on every run.
From a built wheel
make build
pip install dist/prizm_adls_scanner-*.whl
Note: pyspark is not a package dependency. Databricks already provides Spark. Do not install PyPI pyspark on the cluster.
Databricks notebook usage
Use a thin notebook; all job logic lives in the package:
%pip install prizm-adls-scanner
dbutils.library.restartPython()
import json
from prizm_adls_scanner.databricks import run_metric_notebook_job
WIDGET_NAMES = [
"job_config",
"storage_account",
"access_key",
"client_id",
"client_secret",
"tenant_id",
"uc_catalog",
"uc_schema",
"exception_url",
"run_id",
"file_batch",
"job_type",
"connector",
"container",
"asset_id",
"source_id",
]
for name in WIDGET_NAMES:
try:
dbutils.widgets.text(name, "")
except Exception:
pass
widgets = {}
for name in WIDGET_NAMES:
try:
widgets[name] = dbutils.widgets.get(name)
except Exception:
widgets[name] = ""
result = run_metric_notebook_job(
spark=spark,
dbutils=dbutils,
widgets=widgets,
)
dbutils.notebook.exit(json.dumps(result, default=str))
A reference notebook source also ships in the repo as prizm_adls_scanner/databricks/notebook/prizm_iceberg_notebook.py.
API
from prizm_adls_scanner.databricks import (
run_metric_notebook_job, # routes by widgets["job_type"] to the right runner
run_exception_job,
run_exception_notebook_job,
run_lookup_job,
run_comparison_job,
run_materialize_job,
)
# also available directly off the top-level package (lazy import):
from prizm_adls_scanner import run_exception_job
| Argument | Description |
|---|---|
spark |
Active Databricks SparkSession |
dbutils |
Optional dbutils |
widgets |
Dict of notebook/job widget values |
Every runner returns a dict with at least status (success / failed). On failure, includes error / errors.
run_metric_notebook_job routes by widgets["job_type"]:
EXCEPTION/EXCEPTION_METADATA→ exception runnerLOOKUP→ lookup runnerCOMPARISON→ comparison runnerBEHAVIORAL→ side-snapshot runnerMATERIALIZE_ICEBERG/DELETE(oris_delete_action, or nojob_type) → materialize runner (ADLS → Unity Catalog Delta UniForm)
Development
Development Setup
pip install -e ".[dev,test]"
Running Tests
Most of the test suite runs without pyspark installed (package-surface/import checks); a couple of tests are skipped automatically if pyspark isn't present.
make test
Building Wheels
make build
For offline/local environments where build dependencies are already installed:
make build-local
Clean Build Artifacts
make clean
Package Layout
prizm_adls_scanner/
__init__.py # lazy top-level re-exports
databricks/
__init__.py # run_exception_job, run_lookup_job, run_comparison_job,
# run_materialize_job, run_metric_notebook_job
_runtime.py # shared runtime helpers
exception_runner.py # EXCEPTION / EXCEPTION_METADATA runtime
exception_notebook.py # reference notebook source
exception_metadata_runner.py # exception metadata runtime
lookup_driver.py / lookup_runner.py # LOOKUP runtime
comparison_driver.py / comparison_runner.py # COMPARISON runtime
materialize_runner.py # MATERIALIZE_ICEBERG / DELETE runtime
side_snapshot_runner.py # BEHAVIORAL runtime
catalog/ # ADLS_TECHNICAL_CATALOG runtime
notebook/prizm_iceberg_notebook.py # reference Iceberg notebook source
License
MIT License
Support
For issues and questions, please visit: https://github.com/DQLabs-Inc/prizm-cli/issues
Release files for prizm-adls-scanner 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 16.1 MB
Release files / prizm_adls_scanner-0.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | prizm_adls_scanner-0.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
bd81fc6c218da3ec08dfe0c5f1735d1f046f426139c0914a8033c84f073413aa
|
|
BLAKE2b-256 checksum How to use checksums |
e761f78fa6dab3634238816e542824d6eb0bbecdbac47cb0c81ddeb7d6242693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / prizm_adls_scanner-0.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | prizm_adls_scanner-0.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
b538a08c2b7c97e86d8795d7d0c6c3c2c7593e09ac2c0332c30a5cb33a4656b4
|
|
BLAKE2b-256 checksum How to use checksums |
5f1b6eef67edf586294e489df1c730ac8e1be2fb6f9b2dedc2c19406ecb25f93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / prizm_adls_scanner-0.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | prizm_adls_scanner-0.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8489340bc301a3fba365b303f8bf3ff98f963151b90866227cd0184185908eb5
|
|
BLAKE2b-256 checksum How to use checksums |
e98da77050787ea1cf84bf6f1a0d8b382b6ee94e30341124011afff9c45067b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / prizm_adls_scanner-0.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | prizm_adls_scanner-0.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
c49973e370e81a29e5ef58ab2096c89f4aa2bb21e4e1e2e43aa8e29b2c4f8747
|
|
BLAKE2b-256 checksum How to use checksums |
6156a1e3b063994df81c2f8abb3d5f9bf9bf1658587c6d44c87dee3ffd40f2fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / prizm_adls_scanner-0.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | prizm_adls_scanner-0.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
dd794fd04da8af43bca8752363ab352e621506b02644c064c58bfff3e3c95e86
|
|
BLAKE2b-256 checksum How to use checksums |
591c1be37138eea60912d8bc89d6a275d9ee35c2f8846b8fd00af6449a48b4cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log