Define the tables you want; the framework figures out the dependency graph, the compute, and the incremental updates — so you describe what, not how.
Lakeflow Declarative Pipelines is a declarative framework for building batch and streaming ETL pipelines in SQL or Python, where you define datasets and the engine auto-orchestrates their dependencies, execution, and data-quality enforcement.
Hand-rolled ETL means wiring task order, checkpoints, retries, and quality checks yourself across dozens of jobs. Here you declare each table once; the pipeline derives the DAG, runs stages in the right order with the right parallelism, and tracks streaming state for you — the default path for medallion (bronze → silver → gold) pipelines on Databricks.
A pipeline is the container of datasets; a flow reads a source, applies logic, and writes a target. The pipeline analyzes dependencies and orchestrates order and parallelism.
UC-managed table for append-only sources — each record processed exactly once. Use for ingestion and incremental processing of continuously growing data.
UC-managed batch target whose results are recomputed (incrementally when possible) to reflect current source state. Use for transforms and aggregations when sources change via update/delete.
SQL-boolean data-quality constraints checked per record — keep (warn, default), drop the row, or fail the update.
Reading one dataset from another declares the edge; the framework infers the full graph — no manual task ordering.
Default and recommended compute: Databricks-managed, horizontal + vertical autoscaling, no cluster config.
Python · pyspark.pipelines (was: dlt)from pyspark import pipelines as dp
@dp.table # streaming table (returns a streaming read)
@dp.expect_or_drop("valid_id", "id IS NOT NULL") # the line that matters: drop bad rows
def bronze():
return spark.readStream.format("cloudFiles") \
.option("cloudFiles.format", "json").load("/Volumes/raw/events")
@dp.materialized_view # silver MV; dep on bronze inferred automatically
def silver():
return spark.read.table("bronze").dropDuplicates(["id"])
ON VIOLATION DROP ROW / FAIL UPDATE to act on them.FAIL UPDATE aborts the whole update on a single bad row.pyspark.pipelines, was dlt)Verified against docs.databricks.com · June 2026