Local Databricks Development Bridge - Intercept Spark operations for local Unity Catalog access
Project description
MangledDLT - Local Databricks Development Bridge
MangledDLT enables developers to write and test Databricks code locally by intercepting Spark operations and fetching data from remote Unity Catalog environments. Write your PySpark code once and run it anywhere - locally or on Databricks - without changes.
Features
- Transparent Spark Interception: Automatically intercepts
spark.read.table()andspark.readStream.table()calls - Unity Catalog Integration: Fetches data directly from remote Unity Catalog tables
- Smart Caching: LRU cache with TTL for improved development performance
- Multiple Auth Methods: Supports PAT, OAuth, and Service Principal authentication
- Zero Code Changes: Same code works locally and on Databricks
- Connection Pooling: Efficient connection management for better performance
- Error Recovery: Automatic retry with exponential backoff
Installation
pip install MangledDlt
Or with all dependencies:
pip install MangledDlt[all]
Quick Start
from pyspark.sql import SparkSession
from mangledlt import MangledDLT
# Create Spark session as usual
spark = SparkSession.builder \
.appName("LocalDev") \
.getOrCreate()
# Enable MangledDLT
mdlt = MangledDLT()
mdlt.enable()
# Now you can read from Unity Catalog!
df = spark.read.table("main.default.customers")
df.show()
# When done, disable interception
mdlt.disable()
Configuration
Using Environment Variables
export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_TOKEN="dapi..."
export DATABRICKS_WAREHOUSE_ID="your-warehouse-id"
Using Databricks CLI Config
# Configure Databricks CLI
databricks configure --token
# MangledDLT will automatically use your configuration
Using Custom Config
from mangledlt import MangledDLT
config = {
"host": "https://workspace.cloud.databricks.com",
"token": "your-token",
"warehouse_id": "warehouse-id",
"cache_enabled": True,
"cache_ttl": 600 # 10 minutes
}
mdlt = MangledDLT(config=config)
mdlt.enable()
Development vs Production
from pyspark.sql import SparkSession
from mangledlt import MangledDLT
spark = SparkSession.builder.appName("MyApp").getOrCreate()
# Auto-detect environment
if not spark.conf.get("spark.databricks.service.clusterId"):
# Running locally - enable MangledDLT
mdlt = MangledDLT()
mdlt.enable()
print("Running locally with MangledDLT")
else:
print("Running on Databricks")
# Your code works the same in both environments
customers = spark.read.table("catalog.schema.customers")
orders = spark.read.table("catalog.schema.orders")
result = customers.join(orders, "customer_id")
result.show()
Caching
MangledDLT includes intelligent caching to speed up iterative development:
mdlt = MangledDLT(config={
"cache_enabled": True,
"cache_ttl": 1800, # 30 minutes
"cache_max_size": 100 # Max 100 cached queries
})
mdlt.enable()
# First read - fetches from Unity Catalog
df1 = spark.read.table("catalog.schema.large_table") # Takes 5 seconds
# Subsequent reads - served from cache
df2 = spark.read.table("catalog.schema.large_table") # Takes <100ms
# Check cache statistics
stats = mdlt.get_cache_stats()
print(f"Cache hits: {stats['hits']}")
print(f"Hit rate: {stats['hit_rate']}%")
# Clear cache when needed
mdlt.clear_cache()
Error Handling
from mangledlt import MangledDLT
from mangledlt.exceptions import AuthError, TableNotFoundError
try:
mdlt = MangledDLT()
mdlt.enable()
df = spark.read.table("catalog.schema.table")
df.show()
except AuthError as e:
print(f"Authentication failed: {e}")
print("Please check your Databricks credentials")
except TableNotFoundError as e:
print(f"Table not found: {e}")
print("Please verify the table exists and you have access")
Multiple Workspaces
from mangledlt import MangledDLT
from mangledlt.config import Config
# Connect to development workspace
dev_config = Config.from_file(profile="DEV")
dev_mdlt = MangledDLT(config=dev_config)
dev_mdlt.enable()
# Read from dev
dev_data = spark.read.table("dev_catalog.schema.table")
# Switch to production
dev_mdlt.disable()
prod_config = Config.from_file(profile="PROD")
prod_mdlt = MangledDLT(config=prod_config)
prod_mdlt.enable()
# Read from production
prod_data = spark.read.table("prod_catalog.schema.table")
API Reference
MangledDLT
Main class for enabling local Databricks development.
__init__(config=None): Initialize with optional configurationenable(): Enable Spark operation interceptiondisable(): Disable interceptionget_status(): Get connection statusclear_cache(): Clear query cacheget_cache_stats(): Get cache statistics
Config
Configuration management class.
from_file(path, profile): Load from Databricks CLI configfrom_env(): Load from environment variablesvalidate(): Validate configuration
Exceptions
ConfigError: Configuration issuesAuthError: Authentication failuresConnectionError: Connection problemsTableNotFoundError: Table doesn't existPermissionError: Insufficient permissionsInvalidReferenceError: Invalid table reference format
Requirements
- Python 3.9+
- PySpark 3.4+ (user must install separately)
- databricks-sql-connector 2.9+
Development
# Clone the repository
git clone https://github.com/mangledlt/mangledlt.git
cd mangledlt
# Install in development mode
pip install -e .[dev]
# Run tests
pytest tests/
License
MIT License - see LICENSE file for details.
Support
- Issues: https://github.com/mangledlt/mangledlt/issues
- Discussions: https://github.com/mangledlt/mangledlt/discussions
- Documentation: https://github.com/mangledlt/mangledlt/docs
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mangleddlt-0.1.2.tar.gz.
File metadata
- Download URL: mangleddlt-0.1.2.tar.gz
- Upload date:
- Size: 35.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29d712c416d2e577fb191a62348fe4205ad2f5c4a8e4b8f11c2774e8a4d6b24a
|
|
| MD5 |
6174b5e2d317e7e47f26ed6e94592009
|
|
| BLAKE2b-256 |
0b194c555efdf013e27d9fa356d5fbac66982ec60d5f5dcb58db66cf43fb2403
|
File details
Details for the file mangleddlt-0.1.2-py3-none-any.whl.
File metadata
- Download URL: mangleddlt-0.1.2-py3-none-any.whl
- Upload date:
- Size: 42.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4f05df363d9378a029916e6cb96bffaf983a754fce626de019f0473ea9e9b29
|
|
| MD5 |
8866260bf10a1e36955839f21bb4cc40
|
|
| BLAKE2b-256 |
82a311b7c840ce76fdefd6a5c0dce4d048b7043ced1f30d3a334498a6ac91609
|