top of page

Stop Building Pipelines One at a Time

2 days ago
6 min read

Executive summary

Most data teams do not have a data problem. They have a sprawl problem. Every new source gets its own pipeline, every pipeline gets its own scripts, and every gap gets its own tool. A few years in, the team spends more time keeping the machinery running than delivering insight. When someone finally asks for AI on top of the data, nobody can say what the columns actually mean.


This paper argues for a simpler pattern: describe your data once, in metadata, and let a small number of reusable engines do the work. We show what that looks like in practice with a single merge function that runs unchanged on Databricks, Snowflake, and Microsoft Fabric, and we explain why it matters in three ways:


•      Less to build and maintain. One parameter-driven model replaces hundreds of near-duplicate pipeline scripts.

•      Better for AI. Metadata that is enforced, not optional, gives analysts and AI systems the context they need to use data correctly.

•      Lower cost. Fewer tools, fewer pipelines, and fewer specialist hires. In the illustrative scenario in Section 6, savings start at roughly $250,000 per year.


1. The problem: sprawl and over-engineering

Modern data stacks make it easy to add components and hard to remove them. Each addition is reasonable on its own. Together they create three compounding problems.


Pipeline sprawl

Ten source tables become ten pipelines. A hundred become a hundred. They look almost identical, but each has small differences, and nobody is sure which differences are intentional. A fix in one place has to be repeated everywhere, and often is not.


Tool sprawl

Separate tools for ingestion, transformation, orchestration, quality checks, cataloging, and lineage each need licenses, upgrades, access control, and someone who understands them. Every tool boundary is also a place where context gets lost.


Over-engineering

Teams build for scale and flexibility they will never need, then pay for it in complexity every day. The result is a platform that only its original builders can safely change.


The cost of sprawl is not the license fees. It is the engineering hours spent keeping a thousand moving parts aligned.

2. Real data is messy, and out-of-the-box tools do not know your edge cases

Vendor tools and community packages are excellent at the common case. But production data is not the common case. It arrives late, arrives twice, changes shape without warning, carries keys that are not as unique as the documentation says, and reflects business rules that exist nowhere except in someone's head.


Generic merge utilities and standard transformation macros are built to be broadly applicable, which means they are deliberately not built around your particular exceptions. When one of those exceptions shows up in production, the team has three choices: wait for the vendor, bolt on a workaround, or fork the logic. Workarounds are how sprawl starts.


The alternative is to own the small amount of core logic that actually encodes your business rules, keep it in one place, and make it configurable. That gives you two things generic tools cannot: precise control over edge-case behavior, and fast debugging when something breaks, because there is only one place to look.


3. The approach: describe once, run everywhere

A metadata-driven platform separates what your data is from how it is processed. Instead of writing a pipeline per table, you declare each table's definition once and a shared engine does the rest. Five principles make this work:

Principle

What it means in practice

One declarative schema

A single definition per table enforces uniformity and stops column drift across clients and environments.

One reusable merge engine

Deduplication and merge behavior are handled by the same logic for every table, with built-in checks on the way through.

Uniform multi-tenant design

Every client or business unit runs on identical schemas, which removes custom one-off fixes.

Metadata caching

Schemas are cached instead of queried from the catalog at runtime. Pipelines run faster and are insulated from unexpected upstream schema changes.

Own the core, buy the rest

Keep full control of business-critical logic. Use commodity tools for commodity problems.

 

The effect is a shift from hundreds of pipeline scripts to one parameter-driven model. Adding a new table becomes a metadata change instead of a development project.


4. Enforced metadata is what makes data AI-ready

AI systems are only as good as the context they are given. A model asked to analyze a column called status has no way to know what its values mean, which system produced it, or whether it is safe to use. Most organizations answer this with a documentation project that is out of date within a quarter.


In a metadata-driven platform, descriptions and definitions are part of the table definition itself. They are required, versioned, and checked by the same process that loads the data. That has practical consequences:


•      Analysts and AI assistants find and interpret data using the same trusted descriptions.

•      Undocumented tables cannot quietly reach production.

•      Governance becomes a by-product of how the platform works rather than a separate workstream.


Metadata is not overhead. It is the interface between your data and every AI use case you will want to build.


5. One merge function, three platforms

The core of the approach is a single merge function that moves data from a raw (bronze) layer into a curated (silver) layer. The same call is used on every platform. Each run reports what was merged and then performs automatic integrity checks for duplicate keys and foreign-key consistency. The screenshots below show the function running in Databricks, Snowflake, and Microsoft Fabric. Implementation details are intentionally omitted.

● ● ●   Databricks  / merge_pipeline   Python                                                                                                           Shared cluster

1   merge_bronze_to_target(catalog=ctx.catalog, db="silver",

    table="bakehouse_sales_customers_history")

Output  |  Completed

    merge into mock.silver.bakehouse_sales_customers_history from

    mock.bronze.bakehouse_sales_customers_history

    mock.silver.bakehouse_sales_customers_history|rows affected: 0|rows inserted: 0

    check_duplicates

    No duplicates found in [silver.bakehouse_sales_customers_history].

    check_foreign_keys_by_table

    SUCCESS

Figure 1. Databricks. The merge reports rows affected and inserted, then runs duplicate and foreign-key checks.

● ● ●   Snowflake  / WORKSHEETS / merge_demo   Python worksheet                                               Warehouse: COMPUTE_WH

1   result = merge_bronze_to_target(catalog=ctx.catalog, db="silver",

    table="bakehouse_sales_customers_history")

    print(result)

Output  |  Completed

    merge into mock.silver.bakehouse_sales_customers_history from

    mock.bronze.bakehouse_sales_customers_history

    mock.silver.bakehouse_sales_customers_history|rows inserted: 1

    check_duplicates

    No duplicate keys found in [silver.bakehouse_sales_customers_history].

    check_foreign_keys_by_table

    SUCCESS

Figure 2. Snowflake. The identical call, same behavior and same checks.

● ● ●   Microsoft Fabric  / merge_pipeline   Python                                                                            Lakehouse: sales_lakehouse

1   result = merge_bronze_to_target(catalog=ctx.catalog, db="silver",

    table="bakehouse_sales_customers_history")

    print(result)

Output  |  Completed

    merge into mock.silver.bakehouse_sales_customers_history from

    mock.bronze.bakehouse_sales_customers_history

    mock.silver.bakehouse_sales_customers_history|rows inserted: 1

    check_duplicates

    No duplicate keys found in [silver.bakehouse_sales_customers_history].

    check_foreign_keys_by_table

    SUCCESS

Figure 3. Microsoft Fabric. Same function, third platform. Moving platforms does not mean rewriting pipelines.


What the figures show is the point: the person running the merge supplies a table name. Everything else, including keys, schema, and rules, comes from metadata. That is why one function can serve every table and every platform.


6. What it saves: hours, hires, and dollars

The most expensive line item in a sprawling data stack is rarely software. It is people. Pipeline-per-table architectures create permanent maintenance work, and the usual response is to hire a specialist, often a dedicated dbt or analytics-engineering lead, to keep the transformation layer under control.


A metadata-driven platform reduces both the maintenance load and the need for that hire. The table below is an illustrative scenario for a mid-sized organization. Your numbers will differ, so treat it as a framework for your own estimate rather than a guarantee.


Savings lever

Illustrative assumption

Annual value

Avoided specialist hire

One dedicated dbt / analytics-engineering lead, fully loaded (salary, benefits, overhead)

$160,000 - $200,000

Reduced pipeline maintenance

About 10 to 15 engineering hours per week no longer spent patching near-duplicate pipelines, at a blended $100 per hour

$60,000 - $80,000

Tool consolidation

Fewer overlapping licenses, plus less admin and upgrade work

$30,000 - $50,000

Total (illustrative)

 

$250,000 - $330,000 per year

 

Even at the low end of these assumptions, a single avoided hire plus recovered maintenance time reaches the neighborhood of a quarter of a million dollars per year, and the savings scale as the number of tables, clients, and platforms grows, because the marginal cost of the next table approaches a metadata change.


There are further benefits that do not show up in the table: faster onboarding of new data sources, fewer production incidents, quicker debugging, and a smaller key-person risk, since the logic lives in one documented place instead of in many scripts only their authors understand.


7. Guardrails: what this approach asks of you

Metadata-driven design is not magic. It works when a few disciplines are in place:


•      Good database design. Efficiency depends on well-defined business keys. Aim for three columns or fewer, typically integers or short strings, such as an account ID and a customer ID.

•      Discipline about what is custom. Own the logic that encodes your business rules. Do not rebuild commodity capabilities.

•      Metadata as a hard requirement. If descriptions are optional, they will not exist. Enforce them in the load process.

•      Clear boundaries. A small, well-tested core is an asset. A core that grows into a second sprawl is a liability.


This is also not an argument against vendor tools. It is an argument for choosing them deliberately, and for not letting the tool boundary define where your business logic lives.


8. Where to start


•      Inventory the sprawl. Count the pipelines, the tools, and the hours spent maintaining each.

•      Find the near-duplicates. The pipelines that differ only by table name are your first candidates for consolidation.

•      Define the metadata contract. Decide what every table must declare before it is allowed into production.

•      Pilot on one domain. Prove the pattern on a single subject area, measure the hours saved, then expand.

•      List your real edge cases. These determine which logic you must own and which you can safely buy.


Reducing complexity is not a compromise. For most data teams, it is the fastest route to reliable analytics and to AI that can be trusted.

 


Comments


bottom of page