Chapter 5 of 8

Jobs

Assets can be materialized manually through the Dagster UI. For automation, assets are grouped into jobs.

A job defines a selection of assets that execute together as a unit:

from pathlib import Path
import polars as pl
import dagster as dg
from dagster_duckdb_polars import DuckDBPolarsIOManager


@dg.asset(io_manager_key="io_manager")
def plays() -> pl.DataFrame:
    date = Path("2025/10/16")
    df = pl.read_csv(date / "plays.csv")
    return df


io_manager = DuckDBPolarsIOManager(database="db.duckdb")
plays_job = dg.define_asset_job("plays_job", selection=["plays"])


def definitions() -> dg.Definitions:
    return dg.Definitions(
        assets=[plays],
        resources={"io_manager": io_manager},
        jobs=[plays_job]
    )

Job Selection

The selection parameter accepts:

  • Asset names["plays", "artists"]
  • Asset groupsAssetSelection.groups("spotify")
  • Upstream/downstreamAssetSelection.keys("plays").upstream()

Jobs vs Assets

ConceptDefines
AssetWhat data to produce
JobWhich assets to run together
Schedule/SensorWhen to run a job

Jobs are the bridge between asset definitions and execution triggers.