Scamander MDIF

Scamander (Metadata-Driven Ingestion Framework, of MDIF) is een multi-platform Python SDK voor metadata-gestuurde data-ingestie en -transformatie op Spark-gebaseerde platforms. Het abstraheert de verschillen tussen Microsoft Fabric en Databricks weg, zodat één ingestie- of transformatiepipeline ongewijzigd op beide draait, of op vanilla PySpark voor lokaal testen.

De Airflow providers van het platform (zie Custom Airflow providers) bepalen wanneer en waar een job draait. MDIF is de library die de eigen code van die job importeert: de notebook-kernel waarop een SparkNotebookOperator-taak draait is een Spark-driver, en meestal is het MDIF dat daarbinnen het daadwerkelijke lezen, transformeren en schrijven doet.

Een paar dingen die MDIF standaard biedt:

  • Dezelfde Python-code draait zonder aanpassingen op Fabric, Databricks en lokale Spark.

  • Delta-tabellen worden rechtstreeks aangemaakt vanuit JSON-metadata, inclusief datatypes, nullability, primary/foreign keys en SCD Type-2-historiekolommen.

  • Een chainable Transformer-API dekt het volledige bronze→silver→gold-traject: type casting, cleaning, joins, aggregaties, window functions en pivots.

  • QualityChecker draait Great Expectations suites tegen elke Spark DataFrame vanuit een config-gestuurd expectation-model, logt de resultaten en werpt optioneel een fout op bij falen.

  • Anonymizer verzorgt anonimisering en pseudonimisering: zes technieken (hash, mask, redact, generalize, encrypt, fake) aangestuurd door een declaratieve AnonymizationConfig, direct te koppelen in de Transformer-chain als .anonymize(config).

  • Elke pipeline-run produceert leesbare console-logs, die automatisch worden doorgestuurd naar gestructureerde machine-logs die worden weggeschreven naar een Delta-tabel.

  • CSV-, JSON-, Oracle-, SQL Server-, PostgreSQL- en Lakehouse-bronnen worden allemaal benaderd via dezelfde Source.connect()-interface.

  • Een session-wrapper verzorgt de OAuth 2.0-tokenrefresh voor REST API-calls, zodat je dat niet zelf hoeft te doen.

Architectuur

src/scamander/
├── processor/          # Platform (abstract base, auto-detecting factory),
│                       # Fabric, Databricks, Spark (vanilla fallback)
├── sources/             # Source (factory) + csv/json/oracle/postgresql/
│                       # sqlserver/lakehouse connectors
├── sinks/               # Sink (factory) + lakehouse_sink
├── transformations/    # Transformer (fluent builder), cleaning
│                       # (bronze→silver), enrichment (silver→gold), scd
├── quality/             # QualityChecker, QualityReporter
├── anonymization/      # Anonymizer + pure anonymization functions
├── secrets/             # SecretProvider + Vault / Azure Key Vault /
│                       # Databricks implementations
├── models/              # Pydantic config models: Config, per-source and
│                       # per-sink options, transformation/quality/
│                       # anonymization config
├── utils/               # extract_archive, read_json_records
├── logging/             # HumanLogger (stdout), MachineLogger (Delta table)
└── api/                 # OAuth2Session (auto-refreshing requests.Session)