KData / News / Guide
Knowledge article · Netezza to Databricks

A risk-managed migration from Netezza to Databricks.

Lessons from an agile Netezza to Databricks program at a Tier 1 railroad.

By Marc-Eric LaRocque, VP, KData12 min read
8000+data entities migrated
4000+data pipelines built
5 PB+data moved to Databricks

Every team that owns a Netezza appliance knows the moment is coming. The hardware is aging, workloads keep growing, and leadership is asking why the platform cannot keep pace with the analytics and AI ambitions of the business. Faced with that pressure, most teams reach for a single question: how fast can we convert the code?

After delivering a large-scale Netezza migration to Databricks for a Tier 1 North American railroad, our strongest conviction is that this is the wrong question to lead with.

Automation moves code. Trust moves the business onto the new platform.

The programs that succeed treat the migration as an agile delivery problem built on data the organization can believe in, not as a code translation exercise measured by a compile rate.

Why Netezza migrations stall

The failure modes are remarkably consistent across the industry, and they rarely show up where teams are looking.

The first is treating the work as a pure lift and shift. The appliance quietly absorbed a great deal of behavior over the years: distribution logic, procedural code, and concurrency rules that simply do not exist in the same form on a lakehouse. Teams discover this late, after they have committed to a literal translation, and what was scoped as a shift becomes an accidental re-architecture.

The second is undocumented business logic. The rules that turn raw data into the tables the business actually trusts often live in a few people's heads or in scripts nobody has read in years. The program runs cleanly until it reaches the transformation layer, and then it stops.

The third is leaving validation to the end. When reconciliation is treated as a final gate rather than a continuous discipline, the confidence to cut over never arrives. The technology works, but nobody can prove the new numbers match the old ones, and the program stalls one step short of production.

Everything that follows is the cure for those three patterns.

Best practices that moved the needle

Four practices did the heavy lifting on this program.

01Discovery before design

Before any conversion began, we inventoried the tables, pipelines, dependencies and consumers, and forced an explicit split between flows critical to operations and flows the business was willing to deprecate. This surfaces hidden complexity while it is still cheap to deal with.

02A factory model with defined gates

Dozens of streams cannot move on heroics. We ran the program as a factory, with clear entry and exit criteria for every phase, so each stream cleared the same quality bar in the same way. Consistency, not effort, is what scales.

03Automation with judgment held in reserve

A converter does the bulk of the work, and the large majority of objects fall into the easy and medium buckets. The discipline is to keep human attention for the small tail of complex objects, where a careless automated conversion does the most damage.

04Medallion architecture as the trust mechanism

Bronze mirrors the source exactly. Silver is where mappings, validations and change data capture live. Gold serves the business. We resolved what every timestamp meant, and which one identified the newest version of a record, before we touched silver.

An agile delivery strategy

The instinct to move everything at once is the most expensive instinct in this category of work. We did the opposite.

Workloads were grouped into waves by business domain and complexity, and each wave was delivered through short, repeatable cycles with a fixed lifecycle:

  1. Convert
  2. Compile
  3. Data test
  4. Reconcile
  5. Deploy

A wave that hit trouble was a contained event inside a two week window, not a threat to the whole program. That containment is the entire point of working this way.

The parallel run was our confidence engine. Legacy and Databricks pipelines ran side by side on production data until the results matched exactly or every difference was explained and accepted. We also right-sized the depth of testing to the workload rather than applying one standard everywhere. Three depths are worth naming for any team planning its own program:

Conversion and syntaxCode simply compiles in Databricks.
Conversion + integration testingOutput validated against source data through row counts and column and row level checks.
Full deliveryParallel runs on production data and user acceptance precede cutover. The most critical workloads earned this.

None of this works without clear ownership. We agreed on a responsibility split up front, and a regular governance cadence kept the program honest, surfacing slippage early instead of at the milestone.

Delivery teamConversion, unit testing and integration testing.
CustomerAcceptance, parallel run and go-live decisions.

Managing the risks that actually matter

In a Netezza migration the dangerous risks are seldom the ones on the converter dashboard. They are the assumptions hidden in the appliance, the data the business trusts, and the handoffs between teams. We managed an entire register of these; the most instructive are below, each with the risk, the mitigation we ran, and the fallback when the mitigation was not enough.

Risk 01Undocumented mappings and business logic

The program ran cleanly into the transformation layer, then risked stalling because the rules behind trusted tables were never written down.

Mitigation
We made confirmed mappings a hard entry criterion: silver work on a domain did not begin until its rules were validated by the customer's subject matter experts.
Fallback
When a gap appeared mid wave, we flagged the rework immediately, reprioritized so unblocked domains kept moving, and quarantined the disputed logic rather than guessing at it.
Risk 02Constructs with no direct equivalent

Procedural code written in NZPLSQL, temporary tables, and column constraints such as UNIQUE and DEFAULT do not exist in the same form on Databricks. A literal conversion either fails or, worse, silently changes behavior.

Mitigation
We refactored stored procedures into a combination of SQL and Python notebooks, replaced temporary tables with session scoped temporary views, and rebuilt constraints as explicit validation logic, establishing each pattern once and reusing it across waves.
Fallback
The genuinely hard cases were routed into a manual track so they never gated the automated flow.
Risk 03Function level behavioral differences

Some code compiles and runs but produces different answers. A documented example is add_months, which handles leap years differently across the two platforms. That kind of difference passes a syntax check and fails a business audit.

Mitigation
We maintained a catalog of known differences and added targeted tests for every function on it.
Fallback
When a difference surfaced in a parallel run, we corrected the pattern centrally and re-ran validation rather than patching one job at a time.
Risk 04Transaction and rollback model differences

Teams assume Netezza concurrency semantics carry over. They do not. Delta defaults to a write serializable isolation level, under which a reader can briefly see a state the table history says never existed, and Netezza's ROLLBACK has no direct equivalent.

Mitigation
We set isolation to serializable where concurrency correctness mattered and replaced rollback patterns with Delta versioning for audit and recovery.
Fallback
For the most sensitive pipelines, we ran them single threaded through cutover and lifted concurrency only once results were confirmed.
Risk 05Data that does not reconcile at cutover

The program can reach go live only to have the business withhold sign off because no one can prove the numbers match.

Mitigation
We treated validation as continuous rather than as a final event, running row count, column level, row level, and subset checks every cycle.
Fallback
When variance remained, the contingency was simple and firm: extend the parallel run and hold cutover until the difference was either zero or explained and accepted in writing.
Risk 06Consumers stranded during transition

Decommissioning a source or cutting a pipeline before every downstream consumer has moved takes a critical report dark.

Mitigation
We ran legacy and Databricks pipelines concurrently with temporary data flows so no consumer was ever without a source, and we staged the decommissioning of Netezza only after each consumer was confirmed cut over.
Fallback
The legacy path stayed warm and reversible until the final consumer was verified, which made a rollback a switch rather than a rebuild.

Two further risks deserve a mention, because they sink programs quietly: environments that arrive late, which we handled by requiring development and integration environments provisioned ahead of the start and routing any delay through formal change control; and compute budgets sized against the appliance footprint rather than real access patterns, which we caught by validating budget against actual query behavior in discovery and escalating scope early.

The through line across every contingency is the same. The agile, wave-based model gives a problem somewhere to live. A risk that surfaces inside a two week wave is a manageable event. The identical risk inside a big bang is a program failure.

The register as a living instrument

Listing risks once at kickoff is theater. The risks above earned their place only because we managed them continuously, through a register that stayed alive for the length of the program.

SeverityLikelihood × impact tells leaders where to spend attention.
One ownerA risk owned by everyone is owned by no one.
Two scoresInherent before mitigation, residual after. The second is the one that matters.
Wave cadenceReviewed every wave, so a risk that moved was caught in days.

A simple summary view rolled the detail up for steering: how many high severity risks remained, how many had been brought down by mitigation, and what was still open by phase. The register did not remove risk from the program. It made risk visible, owned, and trending in a direction the business could see.

Want the full risk register? Every entry, scored and tracked, as a working tool for your own program.

Request the register

Quality as a first class citizen

In a high volume, governed environment, the thing that lets a program move fast and still earn sign off is quality that is built into the pipeline rather than inspected at the end. This is where our accelerators earned their place.

Embedded quality is not a luxury at this scale. It is the mechanism that makes confidence repeatable.

The migration is the beginning

It is tempting to treat go live as the finish line. It is closer to the starting line. Once data lands on the lakehouse, the same discipline that delivered the migration unlocks the work that justified it in the first place: unified governance through Unity Catalog, real observability, and the analytics and AI initiatives that the old appliance could never support.

The durable lesson is straightforward. Treat a Netezza migration as an agile program anchored in trusted data, manage the real risks deliberately rather than hoping they stay hidden, and the platform change stops being a risk to survive and becomes a capability the business can build on.

Planning a Netezza to Databricks migration?

Let's assess your Netezza environment and define a production path. From discovery through cutover, we bring the patterns that work.

Start a discussion See the case study