OpenLineage Visualizer
Choose a sample dataset to explore, or upload your own OpenLineage JSONL file.
Sample Datasets
A custom Spark Scala ETL pipeline ingesting 4 CSV sources through Delta Lake tables with column-level lineage.
50 events · openlineage-from-spark-demo-customer.jsonThe classic dbt jaffle_shop tutorial project — customers, orders, and payments models with staging and mart layers.
90 events · openlineage-from-spark-dbt-jaffle-shop.jsonA larger dbt project modeling the AdventureWorks sample database with sales, products, and customer dimensions.
232 events · openlineage-from-spark-dbt-adventureworks.jsonOr bring your own
Upload Custom JSONLUpload your own OpenLineage JSONL file — parsed entirely in your browser.
OpenLineage Visualized
How lineage flows from query to OpenLineage event — hover any block for sample data.
- 1.User Query — A user submits SQL or DataFrame transformations via SparkSession. 📄 SparkSession.scala
- 2.Catalyst Engine — Spark parses the SQL, resolves table/column references through the catalog, and applies 70+ optimization rules. 📄 QueryExecution.scala
- 3.Logical Plan — The result is an optimized tree of relational operators (Project, Join, Aggregate) with resolved types. 📄 LogicalPlan.scala
- 4.Listener Bus — As execution proceeds, Spark fires SparkListenerEvents (job start/end, stage completion) to all registered listeners. 📄 SparkListener.scala
- 5.Delta Lake — Delta Lake tables appear in the plan as DeltaTableV2 nodes, backed by ACID transactions and a JSON commit log. 📄 OptimisticTransaction.scala
- 6.OL Spark Listener — OpenLineage's listener intercepts these Spark events and triggers lineage extraction. 📄 OpenLineageSparkListener.java
- 7.Plan Visitors — A chain of QueryPlanVisitor classes pattern-match on plan nodes to identify input/output datasets. 📄 QueryPlanVisitor.java
- 8.Column Lineage — ColumnLevelLineageBuilder traces each output column back through expressions to its source columns. 📄 ColumnLevelLineageBuilder.java
- 9.RunEvent Output — The final OpenLineage RunEvent JSON is assembled with job, run, datasets, and column lineage facets. 📄 RunEventBuilder.java
- 10.Event Emitter — EventEmitter receives the built RunEvent and delegates to the OpenLineageClient, which routes it to the configured Transport. 📄 EventEmitter.java
- 11.Transport (File) — FileTransport appends the JSON event as a single line to the configured output file. Other transports include HttpTransport (POST to API) and ConsoleTransport. 📄 FileTransport.java