From 96cd253f6f56fdc5b8a552f2c6df7e180de3b4bc Mon Sep 17 00:00:00 2001
From: Avril Aysha <68642378+avriiil@users.noreply.github.com>
Date: Tue, 4 Nov 2025 13:19:18 +0000
Subject: [PATCH 1/3] create blog
Signed-off-by: Avril Aysha <68642378+avriiil@users.noreply.github.com>
---
src/blog/delta-lake-dagster/index.mdx | 489 ++++++++++++++++++++++++++
1 file changed, 489 insertions(+)
create mode 100644 src/blog/delta-lake-dagster/index.mdx
diff --git a/src/blog/delta-lake-dagster/index.mdx b/src/blog/delta-lake-dagster/index.mdx
new file mode 100644
index 00000000..25f99e5d
--- /dev/null
+++ b/src/blog/delta-lake-dagster/index.mdx
@@ -0,0 +1,489 @@
+---
+title: Delta Lake and Dagster for Modern Data Pipelines
+description: Learn how to use Delta Lake and Dagster for building fast and reliable data pipelines.
+thumbnail: ./thumbnail.png
+author: Avril Aysha
+date: 2025-12-01
+---
+
+This article will explain how and when to use Delta Lake and Dagster to achieve high-performance modern orchestration pipelines.
+
+Delta Lake is an efficient and user-friendly open table format for your structured data. It stores data in Parquet and adds a transaction log for ACID writes, time travel, schema enforcement, and fast reads with data skipping. Dagster is an orchestration framework built around assets. It gives you schedules, retries, backfills, lineage, and a clean way to express dependencies with simple Python.
+
+Using them together gives you reliable writes, repeatable runs, and easy debugging. Your jobs stay simple while your ETL pipelines stay safe and performant.
+
+## Why should I use Delta Lake for Dagster pipelines?
+
+Orchestration pipelines are all about reliability. You need each step in your pipeline to complete cleanly, even when a job dies mid-run. You also want quick reads, painless updates, and easy debugging. Using Delta Lake and Dagster together gives you all of these features out of the box.
+
+Here are some specific reasons to use Delta Lake and Dagster together:
+
+- **You get reliable tables.** Delta Lake gives you ACID transactions, snapshot reads, and version history. Your data updates are atomic and do not leave behind partial writes. Multiple readers see consistent data. And you can always roll back your dataset and audit or debug with confidence. This is much more reliable than using other formats like CSV or Parquet.
+- **You get a Python-native stack.** With [delta-rs](#link-when-live), you read and write Delta tables without Spark or the JVM. It uses Apache Arrow under the hood, so it plays nicely with pandas, Polars, DuckDB, and the rest of your Python toolbox. That keeps your pipelines light, portable, and fast to iterate.
+- **You get efficiency and simplicity.** Dagster models your tables as assets, so it can pick the minimal set of downstream assets to materialize and execute them in the right order. This gives you faster pipelines, lower spend, and predictable results, along with lineage and automatic retries built-in.
+- **You get end-to-end hygiene.** Delta Lake gives you schema enforcement, safe upserts, and time travel. Dagster gives you orchestration, coordination, and observability. Together, you can ship stable BI tables built on flexible OSS tooling without awkward glue code or platform lock-in.
+- **It's all open-source.** Delta Lake and Dagster are OSS, run great locally, and scale to object storage without lock-in. You keep control of your stack and your costs.
+
+## How do Delta Lake and Dagster work together?
+
+Let's take a quick look at how Delta Lake and Dagster work together to provide performance and reliability for your orchestration pipelines.
+
+
+
+At the storage layer, datasets live as **Delta tables**, either on local disk or in cloud platforms like [S3](https://delta.io/blog/delta-lake-s3/), [GCP](https://delta.io/blog/delta-lake-gcp/), or [Azure](https://delta.io/blog/delta-lake-azure-data-lake-storage/). Delta Lake adds the [open table format mechanics](https://delta.io/blog/open-table-formats/) on top of Parquet to give you ACID commits, a [transaction log](#link-when-live), version history, and [advanced data skipping](#link-when-live). This guarantees that each data operation completes atomically and that each read sees a consistent snapshot, even across multiple concurrent engines.
+
+Dagster then sits on top of this as the orchestration layer. Pipelines are expressed as assets with explicit dependencies (for example: `raw_orders` → `clean_orders` → `aggregated_orders`). Dagster's asset graph drives scheduling, backfills, and retries. When an upstream asset changes, it computes the minimal set of downstream assets to materialize and runs them in a safe order. Lineage and run metadata are captured automatically in the UI.
+
+Dagster calls asset code that reads and writes Delta tables using Arrow-compatible DataFrames (pandas/Polars/DuckDB). This asset code is defined by writing simple Python functions and decorating them with the `@asset` decorator.
+
+Here's an example from the Dagster documentation that shows how you can create Dagster Assets and create dependency chains:
+
+```
+ @dagster.asset
+ def hello(context: dg.AssetExecutionContext):
+ context.log.info("Hello!")
+
+ @dagster.asset(deps=[hello])
+ def world(context: dg.AssetExecutionContext):
+ context.log.info("World!")
+```
+
+A small bit of configuration (a Dagster IO manager) holds the Delta base URI and credentials so assets can resolve table locations and access them consistently. Each asset run reads an immutable snapshot of its inputs and produces exactly one commit to its output table. On failure, the commit never appears, and retries remain safe.
+
+Delta Lake provides reliable storage semantics and Dagster provides dependency-aware orchestration, observability, and deployment hygiene. The same code runs locally or against an OSS-friendly cloud.
+
+## Delta Lake and Dagster: Performance
+
+Delta Lake gives you some great features to improve your pipeline performance.
+
+Delta Lake speeds up your queries by skipping files you don't need. It stores min/max stats and paths for your entire table in the transaction log, so engines can prune whole files before scanning. Regular Parquet lacks that central index, which means you often list folders and touch far more data than necessary. This will slow down your work significantly, especially if your data is stored in the cloud where file listing is slow.
+
+
>>>>> gd2md-html alert: inline image link here (to images/image2.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
+
+
+
+Delta Lake also helps you avoid heavy rewrites. With Delta you can **append, update, and upsert** instead of replacing entire datasets. Dagster's asset graph then materializes only what's downstream of the change, which guarantees minimal extra work. Together, you get faster reads, smaller scans, safer writes, and quicker recovery when something goes wrong.
+
+## Delta Lake and Dagster: Reliability
+
+Performance is also about failing early and failing cleanly. Delta Lake and Dagster both have powerful features to guarantee pipeline reliability and avoid costly mistakes.
+
+Delta Lake's ACID commits mean that no partial writes ever land on disk. If a step fails, the table stays unchanged and downstream reads keep working. [Schema enforcement](https://delta.io/blog/2022-11-16-delta-lake-schema-enforcement/) and [schema evolution](https://delta.io/blog/2023-02-08-delta-lake-schema-evolution/) give you the tools to secure your table's consistency and update it as your data evolves.
+
+Dagster adds deterministic orchestration, giving you explicit dependencies, dependable retries, and clear run states. Assets materialize in the correct order, failed steps don't contaminate downstream tables, and you can re-run only the pieces that broke. All of this means you don't waste time chasing silent corruption or re-running whole pipelines when a simple update is enough.
+
+Finally, Delta Lake and Dagster work together to make reliability visible. Delta keeps table history in the transaction log and Dagster records asset lineage and metadata (such as row counts, versions, timestamps). When something looks off, you can trace what changed and recover fast.
+
+## Delta Lake and Dagster example
+
+Let's build an end-to-end code example together to show how Delta Lake and Dagster work together to power efficient and reliable orchestration pipelines.
+
+In this example, will build [an ETL pipeline](https://delta.io/blog/delta-lake-etl/). you will define three assets:
+
+- `raw_orders`: small raw dataset (with one duplicate and one missing value)
+- `clean_orders`: filters bad rows and deduplicates
+- `agg_orders`: joins to a lookup table and aggregates totals per day & category \
+
+We will build a simple Dagster pipeline to orchestrate the assets. We will use the Delta Lake IO Manager built by Dagster to automatically read/write Delta tables for each asset. This IO Manager handles storage paths and read/writes for you in an easy and reliable way. This means that you can just return DataFrames in your code and the IO Manager persists them as Delta Lake tables on disk.
+
+Follow along with the code below to build this example step-by-step. We will use `pandas` as the query engine for this example.
+
+### Set up the Dagster CLI (one time)
+
+The easiest way to run and manage Dagster pipelines on your local machine is by using the Dagster CLI tool. Follow the [instructions in the official Dagster documentation](https://docs.dagster.io/getting-started/quickstart) to install this tool.
+
+Make sure to:
+
+- Install the CLI command tool
+- Create a virtual environment and activate it
+- Install your project as an editable package
+
+After completing the Quickstart steps in the Dagster documentation, create a new project using the following command. Make sure to run it in the directory where you want to create your project folder:
+
+```
+ create-dagster project dagsterdelta_demo
+```
+
+Your new Dagster project should have the following structure:
+
+```
+ .
+ └── dagsterdelta_demo
+ ├── pyproject.toml
+ ├── src
+ │ └── dagster_quickstart
+ │ ├── __init__.py
+ │ ├── definitions.py
+ │ └── defs
+ │ └── __init__.py
+ └── tests
+ └── __init__.py
+```
+
+Install the following extra packages into your virtual environment:
+
+```
+pip install dagster dagster-webserver dagster-dg-cli
+```
+
+Navigate into your project directory and run this next command to generate the required [assets.py](assets.py) file:
+
+```
+dg scaffold defs dagster.asset assets.py
+```
+
+This will add a new [assets.py](assets.py) file to the `defs` directory:
+
+```
+ src
+ └── dagsterdelta_demo
+ ├── __init__.py
+ └── defs
+ ├── __init__.py
+ └── assets.py
+```
+
+### Build ETL Pipeline with Dagster and Delta Lake
+
+Now let's start building our ETL pipeline!
+
+We will walk through our pipeline step by step and the compile it into one single Python script that will go into the [assets.py](assets.py) script that we've just created.
+
+We will need the `dagster-deltalake` and `dagster-deltalake-pandas` libraries to build our pipeline. Install them into your virtual environment using:
+
+```
+ pip install dagster-deltalake dagster-deltalake-pandas
+```
+
+#### **Configure the Delta Lake IO Manager**
+
+Start by configuring a single IO Manager that writes all data output to Delta tables stored under `tmp/dagster_delta_pandas_demo`. Downstream assets automatically read from those tables. This means you don't need to worry about storage paths, access credentials or manual read/writes.
+
+Here's how to configure the Delta Lake IO Manager when using `pandas`:
+
+```
+ from __future__ import annotations
+ import os
+
+ from dagster import Definitions
+ from dagster_deltalake import LocalConfig
+ from dagster_deltalake_pandas import DeltaLakePandasIOManager
+
+ from dagsterdelta_demo.assets import raw_orders, clean_orders, agg_orders
+
+ ROOT_URI = os.environ.get(
+ "DELTA_ROOT_URI",
+ f"tmp/dagster_delta_pandas_demo",
+ )
+
+ io_manager = DeltaLakePandasIOManager(
+ root_uri=ROOT_URI,
+ storage_options=LocalConfig(), # local FS; swap for S3/etc. later
+ schema="orders_demo", # optional; default is "public"
+ )
+
+ definitions = Definitions(
+ assets=[raw_orders, clean_orders, agg_orders],
+ resources={"io_manager": io_manager}, # note: assets use io_manager_key="io_manager"
+ )
+```
+
+Store this code snippet in the [assets.py](definitions.py) file inside your Dagster project.
+
+With this configuration, when you materialize an asset (e.g. an asset called called `raw_orders`), then the Delta Lake I/O manager will automatically store output data within the specified `schema` folder under the provided root directory, e.g. `path/to/deltalake/order_etl/raw_orders`.
+
+#### Define your assets
+
+Next, let's define our assets. These are the three tables that form our simple ETL pipeline:
+
+1. `raw_orders`: returns a pandas DataFrame with a duplicate order and a missing value.
+2. `clean_orders`: drops rows with required-field NULLs, keeps the earliest record for duplicated order_id.
+3. `agg_orders`: joins a small in-memory lookup (product_id → category), derives order_date, then aggregates totals by day and category.
+
+Here's how we will generate our `raw_orders` table. We are hard-coding the data here for simplicity. In real-world scenarios you would probably ingest this data from an external source.
+
+```
+ df = pd.DataFrame(
+ {
+ "order_id": ["A1", "A2", "A2", "A3"], # duplicate A2
+ "customer_id": ["c1", "c2", "c2", None], # missing value
+ "product_id": ["p1", "p2", "p2", "p3"],
+ "qty": [1, 2, 2, 1],
+ "price": [10.0, 5.0, 7.5, 7.5],
+ "order_ts": [
+ "2025-08-01T10:01:00",
+ "2025-08-01T10:05:00",
+ "2025-08-01T10:05:30",
+ "2025-08-01T10:10:00",
+ ],
+ }
+ )
+ df["amount"] = df["qty"] * df["price"]
+```
+
+The `raw_orders` table contains two intentionally faulty rows: one duplicate and one with a missing value (`None`).
+
+```
+ order_id customer_id product_id qty price order_ts amount
+0 A1 c1 p1 1 10.0 2025-08-01T10:01:00 10.0
+1 A2 c2 p2 2 5.0 2025-08-01T10:05:00 10.0
+2 A2 c2 p2 2 7.5 2025-08-01T10:05:30 15.0
+3 A3 None p3 1 7.5 2025-08-01T10:10:00 7.5
+```
+
+The next step will be to clean this raw data in order to get our `clean_orders` table:
+
+```
+ df_clean = df.dropna(subset=["order_id", "customer_id", "product_id"]).copy()
+ df_clean["order_ts_dt"] = pd.to_datetime(df_clean["order_ts"])
+ df_clean = df_clean.sort_values(["order_id", "order_ts_dt"]).drop_duplicates(
+ subset=["order_id"], keep="first"
+ )
+ df_clean = df_clean.drop(columns=["order_ts_dt"]).reset_index(drop=True)
+```
+
+Our cleaned table has no missing value and no duplicate records:
+
+```
+ order_id customer_id product_id qty price order_ts amount
+ 0 A1 c1 p1 1 10.0 2025-08-01T10:01:00 10.0
+ 1 A2 c2 p2 2 5.0 2025-08-01T10:05:00 10.0
+```
+
+Finally, let's join our cleaned orders to a lookup table that contains information about the product category:
+
+```
+ product_lookup = pd.DataFrame(
+ {"product_id": ["p1", "p2", "p3"], "category": ["widgets", "gadgets", "gadgets"]}
+ )
+ df = clean_orders.merge(product_lookup, on="product_id", how="left").copy()
+ df["order_date"] = pd.to_datetime(df["order_ts"]).dt.date
+ out = (
+ df.groupby(["order_date", "category"], as_index=False)
+ .agg(orders=("order_id", "count"), total_amount=("amount", "sum"))
+ .sort_values(["order_date", "category"])
+ .reset_index(drop=True)
+ )
+```
+
+This gives us an aggregated table of sales per product category:
+
+```
+ order_date category orders total_amount
+ 0 2025-08-01 gadgets 1 10.0
+ 1 2025-08-01 widgets 1 10.0
+```
+
+#### Build Dagster Pipeline
+
+Now that we have our ETL code, it's time to turn this into Dagster assets.
+
+Dagster assets are simply Python functions decorated with the `@assets` decorator. So we will take each step in our pipeline and turn it into a Python function.
+
+We first generate our `raw_orders` asset:
+
+```
+ @asset(io_manager_key="io_manager")
+ def raw_orders() -> pd.DataFrame:
+ df = pd.DataFrame(
+ {
+ "order_id": ["A1", "A2", "A2", "A3"], # duplicate A2
+ "customer_id": ["c1", "c2", "c2", None], # missing value
+ "product_id": ["p1", "p2", "p2", "p3"],
+ "qty": [1, 2, 2, 1],
+ "price": [10.0, 5.0, 7.5, 7.5],
+ "order_ts": [
+ "2025-08-01T10:01:00",
+ "2025-08-01T10:05:00",
+ "2025-08-01T10:05:30",
+ "2025-08-01T10:10:00",
+ ],
+ }
+ )
+ df["amount"] = df["qty"] * df["price"]
+ return df
+```
+
+Notice how we:
+
+1. Create a simple Python function
+2. Decorate it with the `@asset` decorator
+3. Add the `io_manager` configuration
+4. Output a simple DataFrame
+
+The Delta Lake IO Manager will take care of writing this DataFrame to a Delta Lake table at the `ROOT_URI` defined in our Definitions object. You don't have to worry about any of that.
+
+Next let's filter this raw data to create our `clean_orders` asset:
+
+```
+ @asset(io_manager_key="io_manager")
+ def clean_orders(raw_orders: pd.DataFrame) -> pd.DataFrame:
+ df = raw_orders.dropna(subset=["order_id", "customer_id", "product_id"]).copy()
+ df["order_ts_dt"] = pd.to_datetime(df["order_ts"])
+ df = df.sort_values(["order_id", "order_ts_dt"]).drop_duplicates(
+ subset=["order_id"], keep="first"
+ )
+ df = df.drop(columns=["order_ts_dt"]).reset_index(drop=True)
+ return df
+```
+
+Notice how we:
+
+1. Simply reference the `raw_orders` table by its asset name
+2. Output a simple DataFrame.
+
+Again, we don't need to worry about loading the underlying Delta table. This is handled by the IO Manager.
+
+Finally, we join our cleaned rows to the lookup table to create our `agg_orders` asset:
+
+```
+ @asset(io_manager_key="io_manager")
+ def agg_orders(clean_orders: pd.DataFrame) -> pd.DataFrame:
+ product_lookup = pd.DataFrame(
+ {
+ "product_id": ["p1", "p2", "p3"],
+ "category": ["widgets", "gadgets", "gadgets"],
+ }
+ )
+ df = clean_orders.merge(product_lookup, on="product_id", how="left").copy()
+ df["order_date"] = pd.to_datetime(df["order_ts"]).dt.date
+ out = (
+ df.groupby(["order_date", "category"], as_index=False)
+ .agg(orders=("order_id", "count"), total_amount=("amount", "sum"))
+ .sort_values(["order_date", "category"])
+ .reset_index(drop=True)
+ )
+ return out
+```
+
+Great work. Now let's stitch it all together.
+
+Here is the complete script that you can paste into your project's [assets.py](assets.py) file:
+
+```
+ from __future__ import annotations
+ from __future__ import annotations
+ import os
+
+ import pandas as pd
+
+ from dagster import Definitions, asset
+ from dagster_deltalake import LocalConfig
+ from dagster_deltalake_pandas import DeltaLakePandasIOManager
+
+ ROOT_URI = os.environ.get(
+ "DELTA_ROOT_URI",
+ f"tmp/dagster_delta_pandas_demo",
+ )
+
+ io_manager = DeltaLakePandasIOManager(
+ root_uri=ROOT_URI,
+ storage_options=LocalConfig(), # local FS; swap for S3/etc. later
+ schema="orders_demo", # optional; default is "public"
+ )
+
+ definitions = Definitions(
+ assets=[raw_orders, clean_orders, agg_orders],
+ resources={"io_manager": io_manager}, # note: assets use io_manager_key="io_manager"
+ )
+
+ @asset(io_manager_key="io_manager")
+ def raw_orders() -> pd.DataFrame:
+ df = pd.DataFrame(
+ {
+ "order_id": ["A1", "A2", "A2", "A3"], # duplicate A2
+ "customer_id": ["c1", "c2", "c2", None], # missing value
+ "product_id": ["p1", "p2", "p2", "p3"],
+ "qty": [1, 2, 2, 1],
+ "price": [10.0, 5.0, 7.5, 7.5],
+ "order_ts": [
+ "2025-08-01T10:01:00",
+ "2025-08-01T10:05:00",
+ "2025-08-01T10:05:30",
+ "2025-08-01T10:10:00",
+ ],
+ }
+ )
+ df["amount"] = df["qty"] * df["price"]
+ return df
+
+ @asset(io_manager_key="io_manager")
+ def clean_orders(raw_orders: pd.DataFrame) -> pd.DataFrame:
+ df = raw_orders.dropna(subset=["order_id", "customer_id", "product_id"]).copy()
+ df["order_ts_dt"] = pd.to_datetime(df["order_ts"])
+ df = df.sort_values(["order_id", "order_ts_dt"]).drop_duplicates(
+ subset=["order_id"], keep="first"
+ )
+ df = df.drop(columns=["order_ts_dt"]).reset_index(drop=True)
+ return df
+
+ @asset(io_manager_key="io_manager")
+ def agg_orders(clean_orders: pd.DataFrame) -> pd.DataFrame:
+ product_lookup = pd.DataFrame(
+ {
+ "product_id": ["p1", "p2", "p3"],
+ "category": ["widgets", "gadgets", "gadgets"],
+ }
+ )
+ df = clean_orders.merge(product_lookup, on="product_id", how="left").copy()
+ df["order_date"] = pd.to_datetime(df["order_ts"]).dt.date
+ out = (
+ df.groupby(["order_date", "category"], as_index=False)
+ .agg(orders=("order_id", "count"), total_amount=("amount", "sum"))
+ .sort_values(["order_date", "category"])
+ .reset_index(drop=True)
+ )
+ return out
+```
+
+#### **Run your Pipeline**
+
+Now we're all set to run our ETL pipeline.
+
+Run `dagster dev` from the project root. You can access the Dagster web UI at [http://127.0.0.1:3000/](http://127.0.0.1:3000/):
+
+>>>>> gd2md-html alert: inline image link here (to images/image3.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
+
+
+
+Click on `Materialize an asset`:
+
+>>>>> gd2md-html alert: inline image link here (to images/image4.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
+
+
+
+Click on `Materialize all` and then navigate to `Runs` to see your completed pipeline:
+
+>>>>> gd2md-html alert: inline image link here (to images/image5.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
+
+
+
+You can then inspect information about each Asset in more detail, for example here's the `agg_orders` Asset:
+
+>>>>> gd2md-html alert: inline image link here (to images/image6.png). Store image on your image server and adjust path/filename/extension if necessary.
(Back to top)(Next alert)
>>>>>
+
+
+
+Well done!
+
+## Can I use Delta Lake and Dagster with other query engines?
+
+Yes, you can use the Delta Lake and Dagster integration with other query engines. Take a look at [the Delta Lake documentation](https://delta-io.github.io/delta-rs/integrations/delta-lake-dagster/#using-delta-lake-and-dagster-with-pandas) for instructions on how to run queries with Polars.
+
+## A Note on the IO Manager
+
+I/O managers are a helpful tool in many common usage situations. But when you need lower-level access, the I/O Manager might not be the right tool to use. In these cases you may want to use the Delta Lake Table Resource.
+
+The Delta Lake Table Resource is a low-level access method to the table object. It gives you more fine-grained control and allows for modeling of more complex data. You can also use the Table Resource to run optimization and vacuuming jobs.
+
+## When should I use Delta Lake with Dagster?
+
+You should consider using Delta Lake and Dagster if:
+
+- **You care about clean, reliable ETL runs.** Delta gives ACID writes and snapshot reads. Dagster gives retries, backfills, and lineage.
+- **You want easy CRUD + upserts.** Use SQL-like operations on Delta tables without brittle rewrite jobs.
+- **You need clear history.** Time travel and table history help you debug and audit changes.
+- **You have multiple runs or writers.** Optimistic concurrency keeps parallel pipelines safe.
+- **You prefer DataFrames, not storage code.** The Delta Lake IO Manager lets you return DataFrames and automatically stored them to disk as Delta. \
+
+If your pipelines are tiny, one-off, and never updated, plain Parquet with ad-hoc scripts might be enough. For anything shared, scheduled, or audited, Delta + Dagster is a great fit.
From 111eaf935282596131448d9233eec6792dda4818 Mon Sep 17 00:00:00 2001
From: Avril Aysha <68642378+avriiil@users.noreply.github.com>
Date: Tue, 4 Nov 2025 13:19:26 +0000
Subject: [PATCH 2/3] add images
Signed-off-by: Avril Aysha <68642378+avriiil@users.noreply.github.com>
---
src/blog/delta-lake-dagster/image1.png | Bin 0 -> 1182426 bytes
src/blog/delta-lake-dagster/image2.png | Bin 0 -> 161277 bytes
src/blog/delta-lake-dagster/image3.png | Bin 0 -> 248179 bytes
src/blog/delta-lake-dagster/image4.png | Bin 0 -> 418284 bytes
src/blog/delta-lake-dagster/image5.png | Bin 0 -> 271420 bytes
src/blog/delta-lake-dagster/image6.png | Bin 0 -> 698856 bytes
src/blog/delta-lake-dagster/thumbnail.png | Bin 0 -> 595254 bytes
7 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/blog/delta-lake-dagster/image1.png
create mode 100644 src/blog/delta-lake-dagster/image2.png
create mode 100644 src/blog/delta-lake-dagster/image3.png
create mode 100644 src/blog/delta-lake-dagster/image4.png
create mode 100644 src/blog/delta-lake-dagster/image5.png
create mode 100644 src/blog/delta-lake-dagster/image6.png
create mode 100644 src/blog/delta-lake-dagster/thumbnail.png
diff --git a/src/blog/delta-lake-dagster/image1.png b/src/blog/delta-lake-dagster/image1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5a731452060a95132167cd4a20f35767335f06f
GIT binary patch
literal 1182426
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