Dagster is a modern data orchestration platform designed around software-defined assets—a declarative approach where data pipelines are modeled as first-class objects rather than task-based workflows. Originally developed to address limitations in traditional orchestrators like Airflow, it provides data-aware orchestration with built-in observability, type-checking, and testing capabilities. Core to Dagster's philosophy is treating data assets (tables, files, models) as the primary abstraction rather than tasks, enabling automatic lineage tracking, easier debugging, and a more intuitive mental model for data engineers. The framework supports both asset-based and op-based (task-based) workflows, though assets are recommended for most use cases as they provide superior observability and composability out of the box.
What This Cheat Sheet Covers
This topic spans 16 focused tables and 116 indexed concepts. Below is a complete table-by-table outline of this topic, spanning foundational concepts through advanced details.
A jump-to index of every table row in this cheat sheet.
An interactive map of every table and concept in this topic.
Table 1: Core Asset Definitions
Everything in Dagster starts with the asset—a function decorated to declare the data object it produces. These rows walk through the building blocks you'll reach for daily: the @asset decorator itself, ways to declare dependencies and inputs/outputs, and the metadata, owners, groups, and descriptions that make an asset graph readable and accountable instead of just runnable.
| Concept | Example | Description |
|---|---|---|
@dg.asset def customers(): return pd.read_csv("data.csv") | • Defines a software-defined asset — a Python function that computes and persists data • the asset key is derived from the function name. | |
@dg.asset(deps=[raw_customers]) def clean_customers(): | • Declares upstream dependencies using deps — Dagster ensures parent assets run first• use when upstream asset isn't used as function input. | |
@dg.asset def process(data: AssetIn("source")): | Explicitly configures input behavior for an upstream asset — allows custom partition mappings, metadata, or key overrides. | |
@dg.asset(outs={"a": AssetOut(), "b": AssetOut()}) def multi(): yield Output(val, "a") | Defines multiple outputs from a single asset function — each output is tracked as a separate asset with distinct metadata. | |
dg.materialize([customers, orders]) | The act of executing an asset's function and persisting results to storage — can be triggered via UI, CLI, schedules, or sensors. | |
@dg.external_asset(key="s3_data") def upstream(): pass | Models assets produced outside Dagster (e.g., by Airflow or manual processes) — allows lineage tracking without assuming orchestration control. |