RSA Track · Module 02

Migration Playbooks

Hadoop, EDW, and Snowflake-era estates - the engagements RSAs live in, played out as repeatable plays.

Why migrations are the RSA's bread and butter

RSAs are billable Professional Services consultants, and a large share of PS engagements are platform migrations: a customer has committed to the Databricks Data Intelligence Platform and needs someone embedded who can move a real estate - safely, on a timeline, with the business still running. In the interview loop, the project-delivery round and the panel presentation both reward people who can narrate a migration end to end: not just the target architecture, but the sequencing, the reconciliation, and the politics. This page gives you that narrative as a set of plays.

The engagement arc

Every migration, regardless of source platform, follows the same arc. Internalize it as a six-phase spine you can hang any war story on.

  1. Discovery and assessment. Build an estate inventory: tables, jobs, scripts, reports, users, and the schedules that bind them. Profile workloads - which jobs burn the compute, which run daily vs. quarterly, which have failed silently for months. Map dependencies (job-to-job, table-to-report, system-to-system) because the dependency graph, not the table count, determines sequencing. Output a TCO model and business case: current platform cost, projected Databricks cost, migration effort, and the value unlocked (retired licenses, faster delivery, AI use cases the old stack cannot serve).
  2. Wave planning. Pick a pilot that is real but contained - one business domain with a visible owner and a measurable outcome. Then group the remaining estate into waves by domain, not by technology layer, so each wave delivers something a business stakeholder can sign off. Plan the coexistence period explicitly: both platforms run in parallel, data flows are dual-fed or replicated, and there is a written rule for which platform is the system of record for what, at every point in time.
  3. Execution. Convert code, replatform data, rebuild orchestration. Automate the repetitive 80 percent (DDL conversion, ingestion scaffolding) and spend human effort on the gnarly 20 percent (stored procedures, hand-tuned SQL, business logic nobody documented).
  4. Validation. Parallel-run old and new, reconcile outputs automatically, and publish the evidence. This phase earns the cutover decision - see the reconciliation section below.
  5. Cutover. Flip consumers per wave: repoint reports, switch schedules, freeze writes on the legacy side. Keep a rollback path defined and rehearsed for at least the first cycle.
  6. Decommission. The phase customers skip and then pay for. Archive what compliance requires, kill the legacy schedules, reclaim the licenses, and book the savings - because the TCO case from phase 1 is only true once the old platform actually stops costing money.
In discovery, query-log mining beats interviews. Pull the last 90 days of query and job logs from the source platform before you talk to anyone: it tells you which of the 800 tables are actually read (often under half), which users are real consumers, and which "critical" job has been failing quietly since March. Then use the interviews to explain the logs, not replace them.

Play 1: Hadoop to Databricks

The classic. On-prem Hadoop clusters are aging out - hardware leases expire, vendor support has consolidated, and the talent pool is shrinking. The play is a component-by-component remap plus a code uplift.

Hadoop componentDatabricks targetWhat to watch
HDFSADLS Gen2 / S3 object storageReplatform with DistCp or cloud-native transfer; fix small-file debt during the move, not after.
Hive Metastore + Hive tablesUnity Catalog + Delta LakeConvert to Delta; land governance (see Unity Catalog) in wave 1, not as a retrofit.
HiveQL / Impala queriesDatabricks SQL (Photon)Mostly mechanical; watch nonstandard functions and implicit type behavior.
Spark on YARNDatabricks Runtime / serverless computeCode ports easily; cluster sizing assumptions do not - retune, don't transcribe.
Oozie workflowsLakeflow JobsRebuild DAGs as job tasks with dependencies; Oozie XML is documentation, not a migration source you can trust blindly.
Sqoop importsLakeflow Connect or ADF copy activitiesManaged connectors where sources are supported; ADF or JDBC ingestion otherwise.
HBaseDepends on the workloadAnalytic point lookups: Delta with liquid clustering. True OLTP/serving: Lakebase Postgres (GA on AWS as of early 2026, Azure in preview - check current status) or keep a purpose-built KV store. Don't force-fit.
MapReduce / PigRewrite in SparkNo mechanical path; usually small in number, large in archaeology.

Spark code uplift is the deceptively easy part. Spark-on-YARN code generally runs on Databricks with minor changes, which tempts teams into lift-and-shift. Resist it: configurations tuned for static on-prem clusters (executor counts, shuffle partitions, memory fractions) are wrong on elastic cloud compute, and hardcoded HDFS paths, Hive Metastore calls, and RDD-era APIs all need cleanup. Treat the migration as the moment to modernize to DataFrame/SQL APIs and let the platform (Photon, adaptive query execution) do the optimization the old code did by hand.

Hadoop estates carry two kinds of inherited performance debt that will follow you to the cloud if you let them. Small files: years of hourly ingest into HDFS produces millions of kilobyte-scale files; copy them as-is and your shiny new platform reads slowly and bills you for the privilege. Compact during replatforming and rely on predictive optimization / OPTIMIZE going forward. Skew: jobs that "worked" on-prem often hid skew behind overprovisioned static clusters; on autoscaling compute the straggler tasks become visible as cost. Profile the top jobs, fix the skew (see Performance & Tuning), and set the expectation with the customer that some jobs need rework, not just relocation.

"A customer has 800 Hive tables, 200 Oozie workflows, and a hardware lease expiring in 14 months. How do you plan the migration?"

Strong outline: (1) Discovery first - mine query and job logs; expect a long tail of dead tables and workflows, so the real scope is likely 300 tables and 80 workflows. (2) Anchor the plan to the lease date: work backward to a decommission deadline, with contingency. (3) Pilot one domain end to end - data, jobs, reports, users - to calibrate conversion velocity, then plan waves by business domain using measured throughput, not guesses. (4) Coexistence design: dual-run period per wave, system-of-record rules in writing. (5) Automate DDL and ingestion conversion; hand-craft only the genuinely complex jobs. (6) Reconciliation harness from day one; cutover per wave on evidence. (7) Decommission as a tracked workstream with the savings booked against the business case. Close by asking what the interviewer's customer cares about most - cost, risk, or the deadline - because that ordering changes the plan.

Play 2: Legacy EDW to lakehouse

Teradata, Oracle, SQL Server data warehouses, and increasingly first-generation cloud DWs like Synapse Dedicated SQL Pools. These estates are smaller in raw volume than Hadoop but denser in logic: decades of stored procedures, dialect-specific SQL, and a semantic/reporting layer the business actually runs on.

Schema conversion is the easy layer - automated tools and conversion scripts handle DDL, type mapping, and constraint translation. Decide the target model deliberately: this is your chance to rationalize into a medallion structure (see Reference Architectures) rather than photocopy a 20-year-old star schema, including its mistakes.

Stored procedures are the hard layer. You have four honest strategies, and a real engagement uses all of them:

Dialect translation is mostly tractable because Databricks SQL has absorbed many warehouse idioms. Teradata's QUALIFY, for instance, ports directly; BTEQ's procedural scaffolding does not:

-- Teradata BTEQ
.LOGON tdprod/svc_etl;
SEL acct_id, txn_dt, amt
FROM fin.gl_detail
QUALIFY ROW_NUMBER() OVER (PARTITION BY acct_id ORDER BY load_ts DESC) = 1;
.IF ERRORCODE <> 0 THEN .GOTO ERREXIT;

-- Databricks SQL: QUALIFY ports as-is
SELECT acct_id, txn_dt, amt
FROM fin.gl_detail
QUALIFY ROW_NUMBER() OVER (PARTITION BY acct_id ORDER BY load_ts DESC) = 1;
-- BT/ET transactions and .IF error branching do NOT port:
-- restructure as idempotent MERGE steps with Lakeflow Jobs
-- task dependencies and retry policies carrying the control flow.

The semantic and report layer decides whether the business calls the migration a success. Inventory every report, dashboard, cube, and extract reading the EDW; migrate the high-value ones to Power BI or AI/BI dashboards against Databricks SQL; and parallel-run the numbers, because a report that is fast but disagrees with last quarter's board pack is a failed migration in the eyes of the CFO.

You have two citable EDW-adjacent migration data points. At Maersk, you migrated SSAS multidimensional cubes to Azure Analysis Services Tabular as part of the Fact-Based Reporting program - a textbook semantic-layer migration, the kind that demands model translation, validation against the old cubes, and keeping finance consumers whole while the engine underneath changes. You also moved managed tables to external tables for governance and cost control - a small story that shows you think about storage ownership and decommission economics. At the Port Authority, you migrated PATH Ridership analytics off legacy VBA and MS Access onto parameterized Azure Synapse pipelines with Power BI on top - the long-tail "shadow IT" workload every estate hides, and proof you can modernize the unglamorous end of an inventory, not just the headline warehouse.

Play 3: SSIS/SSRS-era Microsoft estates

This is your deep home turf - say so in interviews. The pattern: on-prem SQL Server databases, hundreds of SSIS packages doing ETL, SSRS for reporting, SQL Agent for scheduling. The Azure Databricks play: databases land in ADLS Gen2 as Delta via ADF or Lakeflow Connect ingestion; SSIS data-flow logic converts to PySpark or Databricks SQL (with ADF's SSIS Integration Runtime as a bridge for packages that must survive the transition unchanged); SSRS reports rebuild in Power BI or AI/BI dashboards; SQL Agent schedules become Lakeflow Jobs and ADF triggers. The trap is package count: 400 SSIS packages usually collapse into a few dozen parameterized, metadata-driven pipelines - which is exactly the metadata-driven ingestion pattern you built at Maersk and the Port Authority.

Your origin story for this play is Microsoft itself: on the Worldwide Payment Services team (via Brillio, 2018-19), you migrated on-prem SQL Server and SSIS workloads to Azure SQL Database and ADF - using the SSIS Integration Runtime as the bridge - and moved SSRS reporting to Power BI, with dimensional models and SCD 0/1/2 handling intact. When an interviewer asks about Microsoft-estate migrations, you are not describing a pattern you read about; you ran this play inside Microsoft, on a payments domain where the numbers had to be right. Frame it as: same arc, smaller target - today you would land the same estate on Databricks with Unity Catalog instead of Azure SQL DB.

Snowflake: coexistence and migration honesty

Snowflake engagements are different in kind: the customer is not fleeing a dying platform, they are weighing two healthy ones. Your credibility - in the engagement and in the panel interview - depends on being honest about that.

Signal for migrating to the lakehouseSignal for coexistence (and saying so)
Heavy Spark/Python data engineering and ML/GenAI workloads bolted awkwardly onto a SQL warehouseEstate is overwhelmingly BI/SQL, well-governed, and the team is productive
Paying twice: a separate Spark platform feeding Snowflake, with data copied between themRecent multi-year Snowflake commitment; migration savings cannot beat the contract math yet
Open-format strategy: wants Delta/Iceberg tables one engine cannot hold hostageMigration capacity is consumed by higher-value work; revisit at renewal
Unified governance ambition across data, ML, and AI assets in one catalogOnly a niche workload fits Databricks today - land that workload, earn trust, expand later

Coexistence is increasingly practical: Unity Catalog's managed Iceberg tables and Delta Sharing mean Databricks-produced data can serve Snowflake consumers in open formats without copy pipelines, as of mid-2026. A phased "Databricks for engineering and AI, Snowflake keeps BI - for now" architecture is often the truthful recommendation, and it routinely converts to a fuller migration once the cost and capability evidence accumulates.

"The customer CFO asks: we already have Snowflake and it works - why migrate anything?" (Expect this in the panel simulation, with deliberate pushback.)

Strong outline: (1) Don't trash-talk - concede Snowflake is a good warehouse; you lose the room the moment you sound like a salesperson. (2) Reframe from product to workload: ask what their data engineering, streaming, and AI workloads run on today and what the combined bill and copy-pipeline overhead looks like. (3) Make the open-format argument: Delta/Iceberg under Unity Catalog means their data outlives any engine decision, including this one. (4) Propose the smallest honest step - one ML or engineering workload on Databricks, coexisting via open tables, measured on cost and delivery speed. (5) Give them a real exit: if the evidence does not show up, the coexistence architecture still stands on its own. Recommending coexistence when migration is not justified is what makes the migration recommendation believable when it is.

Validation and reconciliation discipline

Migrations are judged on one question: do the numbers match? Build the reconciliation harness in the pilot, run it every parallel-run cycle, and publish the results where stakeholders can see them. Layer the checks:

from pyspark.sql import functions as F

KEYS = ["company_code", "account", "fiscal_period"]

legacy_agg = legacy.groupBy(KEYS).agg(F.sum("amount").alias("legacy_amt"))
lake_agg   = lake.groupBy(KEYS).agg(F.sum("amount").alias("lake_amt"))

breaks = (
    legacy_agg.join(lake_agg, KEYS, "full_outer")
    .withColumn("diff",
        F.coalesce("legacy_amt", F.lit(0)) - F.coalesce("lake_amt", F.lit(0)))
    .filter(F.abs(F.col("diff")) > 0.005)   # beyond half a cent = a break
)
# Persist every run to a recon Delta table; alert on breaks > 0.
# The published history IS the cutover evidence.

Two disciplines make the harness trustworthy: full outer joins, so rows existing on only one side surface as breaks instead of vanishing; and timing alignment, so you compare equivalent load cycles - half of all "reconciliation failures" in a coexistence period turn out to be one side reading data the other has not loaded yet.

Reconciliation is your strongest suit - lead with it. At ADM, you own Finance Record-to-Report analytics end to end: Bronze/Silver/Gold pipelines on Azure Databricks and ADF integrating JDE, SAP, HFM, IBM DB2, and IBM APGO Web Wire into Delta, feeding P&L and Budget-vs-Actual KPIs consumed at Executive Committee and CFO level. Numbers at that altitude must tie to the penny against the source systems, every cycle - there is no "directionally correct" in R2R. At Maersk, the Fact-Based Reporting program meant reconciling SAP S/4HANA and AC-DOCA Universal Journal data through the lakehouse into finance reporting. When a migration interviewer asks how you would prove correctness, you can answer from the posture of someone whose daily work is audited by finance, not from a checklist.

The risk register staples

Every migration risk register contains the same recurring entries. Walk in with mitigations already drafted:

In the panel presentation, naming the risk register unprompted is a differentiator. Most candidates present the happy-path architecture; the candidate who says "and here are the four risks I would log on day one, with mitigations" sounds like someone who has carried a cutover pager. You have - use the vocabulary of waves, parallel runs, breaks, and decommission dates.