Column-level lineage: the concepts and the event standard
Table-level lineage says a job touched a table; column-level lineage says which columns feed which. Learn the concepts, the OpenLineage event model that makes lineage work across tools, and how an impact set is computed from a lineage store.
At a glance
| When | A schema change is proposed and someone asks who else uses that column; You must choose a lineage approach and need the vocabulary first |
|---|---|
| Where | Data Lineage |
| Why | Table-level lineage answers "something downstream broke"; column-level lineage answers "this exact field, these exact consumers". |
Learning objectives
- Explain why column-level lineage beats table-level for change impact
- Read an OpenLineage event and name its Airflow, Spark and dbt integrations
- Compute a downstream impact set from a lineage store
What you need
- [object Object]
- A lineage store (DataHub or any OpenLineage-compatible backend)
Steps
- Start from the standard — an open specification for lineage events with integrations for Airflow, Spark and dbt; not a tool or a service, a standard for emitting lineage events. (from ref-openlineage-docs )
- See why the standard matters — an open specification for lineage events is what makes cross-tool lineage possible. (from ref-openlineage-docs )
- Define column-level lineage — traces from an asset to its upstream sources and downstream consumers, reporting the impact set for a proposed change. (from skill-lineage-explainer )
- Hold the two graphs — technical lineage (tables and jobs) versus business lineage (metrics and reports); a breaking change needs both. (from skill-lineage-explainer )
- Practice the walk — read lineages from a lineage store, compute the downstream impact set, distinguish technical from business lineage. (from skill-lineage-explainer )
- Know where events land — the open metadata model for ownership and lineage, plus the ingestion framework that keeps emitted events queryable. (from ref-datahub-docs )
- Keep the driving question in view — "what breaks if I change this column?", answered with evidence. (from skill-lineage-explainer )
Check yourself
- A table-level edge hides the fact that only one column changed — column-level lineage localizes the blast radius.
- An Airflow task, a Spark job and a dbt model produce lineage into one graph because they emit the same event standard.
Worked example
An OpenLineage event, sketched — from ref-openlineage-docs
job: dbt://analytics/stg_orders
inputs: [postgres://prod/orders]
outputs: [warehouse://analytics/stg_orders]
# emitted per run by the integration; column facets carry the
# column-level edges that make the graph worth querying
The impact set walk — from skill-lineage-explainer
changed: stg_orders.customer_email (type widened)
└─▶ downstream: dim_customers.email ──▶ mart_revenue (published — stop)
report: owner, criticality, earliest SLA that breaks
Sourced from
Security scan
Last sweep 2026-10-24: 0 finding(s), 0 marked as examples.
Common gotchas
- Lineage without a standard is a per-tool island — the open spec is what stitches Airflow, Spark and dbt into one graph.
- Column-level lineage is a commitment — parsers must keep up with SQL dialects or the graph lies quietly.
- The impact set is a walk, not a lookup — stop at published marts, where owners and SLAs live.
Production considerations
- Emit events from every job that moves data — partial graphs are worse than none because they look complete.
- Version the lineage store like code — schema of the graph changes with the platform.
Diagram
column-level lineage
|
|- postgres.orders ──(job)──▶ stg_orders ──▶ dim_customers ──▶ mart_revenue
| │ │ │
| └── column edges ──────┴────────────────┘
|
|- change: stg_orders.customer_email
|
|- walk downstream ──▶ stop at published marts
|
--> impact set: owner + criticality + earliest SLA that breaks
Registry stats
| Verification | community · Oct 24, 2026 |
|---|---|
| Completeness | 81 |
| Trust multiplier | ×1.25 |
| Composite | 34.15 · adequate |
| Freshness | 0 days since last source check |
| Difficulty | intermediate |
| Version | 0.1.0 |
| License | CC-BY-4.0 |
| Security flags | none |
Did this solve your problem?
Column-level lineage: the concepts and the event standard