Microsoft Data Engineer Interview Questions & Guide 2026

Prepare Microsoft Data Engineer interviews with executable incremental SQL, CDC replay and schema checks, a skew diagnosis, Fabric scope and a four-week plan.

Topics: Microsoft, Data Engineer, interview guide, SQL, Python, Microsoft Fabric, system design, data engineering

Author: PracHub

Published: 9/3/2026

Microsoft logo
Microsoft · Data EngineerUpdated Oct 9, 2026 · Reviewed by PracHub

Microsoft Data Engineer Interview Questions & Guide 2026

Prepare Microsoft Data Engineer interviews with executable incremental SQL, CDC replay and schema checks, a skew diagnosis, Fabric scope and a four-week plan.

Questions in our bank by interview round

  • Technical Screen1 question

On this page0% read
01 · Overview

Interviewing at Microsoft

A Microsoft Data Engineer interview answer should connect a query to a reliable data product. Returning the right rows once is useful; explaining what survives a restart, a late correction and a schema change shows whether the pipeline can keep returning the right rows. The exact role matters. This guide keeps SQL, Python, distributed processing, governance and role-dependent Fabric preparation, then adds three original exercises: an executable incremental-load fixture, a checkpoint/restart trace and a skewed-join diagnosis. They are practice material, not disclosed Microsoft prompts or a private hiring rubric.

Practice bank
1+ questions
Round types in our bank
1
Read time
14 min
02 · Question bank

The questions most likely to come up

1+ in the Microsoft bank · sorted by popularity
  1. Design a scalable URL shortenerDesign a highly scalable URL shortening service, similar to Bitly or TinyURL. The service converts long URLs into short links and redirects…System DesignTechnical ScreenEasy
Practice 1+ Microsoft questions

A Microsoft Data Engineer interview answer should connect a query to a reliable data product. Returning the right rows once is useful; explaining what survives a restart, a late correction and a schema change shows whether the pipeline can keep returning the right rows.

The exact role matters. This guide keeps SQL, Python, distributed processing, governance and role-dependent Fabric preparation, then adds three original exercises: an executable incremental-load fixture, a checkpoint/restart trace and a skewed-join diagnosis. They are practice material, not disclosed Microsoft prompts or a private hiring rubric.

Data engineering preparation desk with current order values and offset-five notes

Confirm the role before choosing the stack

Microsoft’s technical-interview guidance recommends clarifying ambiguity, planning before implementation, writing runnable code in a familiar language and testing boundaries. Confirm your actual stages, SQL dialect, environment and permitted tools with the recruiter. Do not infer a fixed Data Engineer loop from a general technical page.

Read the requisition for ingestion, modeling, serving, security and operations responsibilities. A team supporting research datasets may care about reproducibility and provenance; an operational analytics team may emphasize freshness, dimensions and reconciliation. The title alone cannot settle that mix.

Fabric documentation describes lakehouses, pipelines, Spark job definitions and notebooks. Study how they fit together when Fabric is named, while keeping the correctness contract separate from service names. The SQL fixture below runs in SQLite; it is not executed T-SQL, Spark SQL or a Fabric transaction.

The visible PracHub company-role bank currently contains a URL-shortener record. It does not substantiate SQL topic frequency. For an adjacent SQL drill, use Design an idempotent SQL ETL for late data. This verified Stripe-tagged Data Scientist record asks about deduplication, late status changes and rerunnable daily metrics. Its data-engineering reasoning transfers; its company and role labels remain Stripe/Data Scientist.

Worked incremental load: define the source contract

Original fixture. One ordered source partition emits immutable events with a positive, contiguous sequence number. The key is an order ID; U replaces an absolute integer amount in minor units, while D deletes the order. Business dates are carried as opaque source metadata. Sequence order is authoritative for state, so a later-arriving correction can carry an older business date.

The teaching contract accepts schema version 1. Amounts for U are nonnegative integers up to 10^12; D requires null. The local runner rejects malformed records, boolean amounts, unsupported schemas, conflicting payloads for the same offset and missing offsets. Identical copies of an offset are replay, not another change. These rules require a trustworthy source; inventing a local receipt order cannot recover missing business order.

SequenceOrderOperationAmountBusiness date
1AU100Oct 8
2BU50Oct 8
3AU120Oct 7
4BDnullOct 9
5CU75Oct 9

After sequences 1–2, active rows are A=100 and B=50, with checkpoint 2. After 3–5, A=120 and C=75 remain active; B has a deletion tombstone at sequence 4; checkpoint is 5. Active count is two and active amount is 195. This is current state, not a historical revenue metric.

Filtering only business_time > last_business_time would miss A’s sequence-3 correction. Absence from an incremental batch is also not a delete. The explicit D event is what removes B from the active view. Retaining B’s sequence prevents an older upsert from resurrecting it.

Incremental fixture showing the late correction, deletion tombstone and checkpoint progression

Executable SQLite transformation

This complete SQL fixture can run against a disposable SQLite database. It reduces the batch to the latest source sequence per key, updates only newer states and commits the inbox, current-state table and checkpoint together. Its fixed input is valid. For arbitrary input, the runner must perform the validation gates described above before executing the transformation. SQL syntax alone is not an external-source validation contract.

CREATE TABLE IF NOT EXISTS inbox(
  seq INTEGER PRIMARY KEY, order_id TEXT NOT NULL,
  op TEXT NOT NULL CHECK(op IN ('U','D')), amount INTEGER,
  business_time TEXT NOT NULL, schema_version INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS orders_current(
  order_id TEXT PRIMARY KEY, seq INTEGER NOT NULL,
  amount INTEGER, deleted INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS checkpoint(
  singleton INTEGER PRIMARY KEY CHECK(singleton=1), seq INTEGER NOT NULL
);
INSERT OR IGNORE INTO checkpoint VALUES(1,0);
CREATE TEMP TABLE IF NOT EXISTS batch(
  seq INTEGER PRIMARY KEY, order_id TEXT NOT NULL, op TEXT NOT NULL,
  amount INTEGER, business_time TEXT NOT NULL, schema_version INTEGER NOT NULL
);

BEGIN IMMEDIATE;
DELETE FROM batch;
INSERT INTO batch VALUES
  (1,'A','U',100,'2026-10-08',1),
  (2,'B','U',50,'2026-10-08',1),
  (3,'A','U',120,'2026-10-07',1),
  (4,'B','D',NULL,'2026-10-09',1),
  (5,'C','U',75,'2026-10-09',1);
INSERT INTO inbox
SELECT * FROM batch WHERE 1
ON CONFLICT(seq) DO NOTHING;

WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (
    PARTITION BY order_id ORDER BY seq DESC
  ) AS rn
  FROM batch
)
INSERT INTO orders_current(order_id,seq,amount,deleted)
SELECT order_id,seq,amount,CASE WHEN op='D' THEN 1 ELSE 0 END
FROM ranked WHERE rn=1
ON CONFLICT(order_id) DO UPDATE SET
  seq=excluded.seq, amount=excluded.amount, deleted=excluded.deleted
WHERE excluded.seq > orders_current.seq;

UPDATE checkpoint
SET seq=MAX(seq, COALESCE((SELECT MAX(seq) FROM batch),0))
WHERE singleton=1;

COMMIT;
SELECT order_id,seq,amount,deleted FROM orders_current ORDER BY order_id;
SELECT seq FROM checkpoint;

Expected current rows are (A,3,120,0), (B,4,NULL,1) and (C,5,75,0); the checkpoint query returns 5. Running this fixed fixture again produces the same rows. The output keeps tombstones; an active-view query adds WHERE deleted=0.

The inbox primary key prevents duplicate offset insertion, but DO NOTHING alone would hide conflicting replay. The local Python runner compares every already-seen offset’s full payload before the load and aborts on a mismatch. It also requires all new offsets after the checkpoint to be contiguous. Both checks execute under BEGIN IMMEDIATE, keeping the checked database state stable for the write transaction.

The runner executes each statement on the same connection inside its explicit transaction. It does not use an execution helper that implicitly commits an existing transaction. If validation or load fails, it rolls back. Only after commit does it return the new checkpoint. No external source acknowledgement occurs in this fixture.

Restart and schema-change cases with observed results

The suite passed 11035 checks across 5000 generated changes in 50 seeds, compared against a plain Python current-state oracle. It included repeated batches, amount validation, schema rejection, offset gaps and conflicting copies. The oracle consumes source order independently instead of using the SQL window query to calculate expected output.

Two actual child processes exited at instrumented points. Exiting before commit left current state empty and checkpoint zero when the database reopened. Exiting after commit but before returning left the complete three-row state and checkpoint five. Replaying the five events then preserved the expected result in both cases.

Failure or changeRequired resultWhat the local check observed
Process exits before commitNo partial load or advanced checkpointEmpty state; checkpoint 0
Commit succeeds, reply disappearsReplay finds committed stateComplete state; checkpoint 5
Offset 6 uses schema 2Hold the ordered stream until handledState and checkpoint unchanged
Offset 7 arrives before 6Do not certify a gap as completeState and checkpoint unchanged
Offset 1 repeats with amount 999Reject conflicting historyState and checkpoint unchanged

Schema compatibility needs an explicit policy. A nullable added field can be normalized to the existing contract if its meaning and consumers permit it. A changed currency, unit or key is not merely a new column. Deploy a versioned transformation, validate its output and replay from a known checkpoint. This fixture deliberately rejects all unsupported versions rather than guessing.

In a real stream, quarantine does not automatically justify advancing past the bad record. Decide whether the product permits incomplete data, and expose that condition if it does. This single-partition model holds progress. Multiple partitions need per-partition checkpoints and a defined rule for entities that can move between partitions.

The tests cover one SQLite database and process exit. They do not establish power-loss durability, remote acknowledgement, source retention, concurrent external sinks or Fabric behavior. A notification or payment sent outside the transaction needs its own delivery and deduplication contract; a database commit does not make that side effect exactly once.

Diagnose this skewed Spark join

Illustrative incident, not a Spark benchmark. A fact table joins a unique dimension by region_key. Most tasks finish in 48 seconds; one takes 900 seconds and reports 12 GB of spill. A key-frequency sample shows 60% of fact rows share an unknown-region key. The simplified plan shape is:

Project
  SortMergeJoin(region_key)
    Sort -> Exchange hashpartitioning(region_key) -> Fact scan
    Sort -> Exchange hashpartitioning(region_key) -> Dimension scan

First confirm actual row counts, join multiplicity, task sizes, shuffle traffic, spill and the final executed plan. A duplicate dimension key can amplify output and must be distinguished from skew. A slow task caused by one poor executor requires a different diagnosis from one consistently huge key.

Increasing the partition count does not split records that still hash on the same hot key. Filtering the unknown key is valid only if the output contract permits dropping those rows. A broadcast may remove a shuffle when the dimension safely fits replicated executor memory; verify the plan and memory rather than blindly forcing a hint.

Spark’s tuning documentation describes runtime statistics, join hints and adaptive skew handling. Those capabilities and settings depend on the actual runtime and join shape. The documentation read here is upstream Spark 4.2.0; it does not establish that a particular Fabric workspace uses that version or configuration.

For a controlled salting exercise, take 120 fact rows: IDs 0–71 have H, and the other 48 use 16 ordinary keys. The dimension has exactly one row per key. Assign H rows salt fact_id % 6; ordinary rows use zero. Replicate only the H dimension row across salts 0–5, then join on (key,salt).

The small Python equivalence check returns the same 120 (fact_id,key,dimension_value) rows as the unsalted join, with 12 hot rows in each salt. It verifies row equivalence and distribution arithmetic, not Spark execution or speed. Choosing random salts independently on both sides would lose matches; replicating every dimension row unnecessarily increases work.

For an aggregate instead of a join, partial groups by (key,salt) must be combined by key. Sum and count combine directly; a mean needs sum plus count, and distinct counts cannot generally be summed. Preserve the mathematical contract while changing physical distribution.

Pipeline and skew decision checklist with concrete expected results and scope limits

Four weeks with concrete deliverables

WeekFocusWork to review
1SQL grain, joins, windows, nulls and PythonFixture outputs, boundary tests and one wrong-query counterexample
2Incremental state, late data and restartReplay trace, delete case, checkpoint and schema rejection
3Spark diagnosis and role-specific platformAnnotated plan, output-equivalence check and relevant Fabric architecture
4Mixed technical mock and project discussionRunnable solution, failure recovery and clear ownership story

For Fabric-focused preparation, map ingestion to a pipeline, transformation to a notebook or Spark job and storage/serving to the relevant lakehouse or warehouse design. Then ask where the table commit, orchestration status and consumer visibility differ. Avoid claiming that all of those controls share the SQLite fixture’s transaction.

Keep governance in the architecture: identify sensitive fields, authorize producers and consumers, retain lineage from source offset to output, and define deletion across raw, curated and derived data. A current-state tombstone is not complete privacy deletion from retained history. State who owns exceptions and how an alert becomes a repair.

For behavioral discussion, explain an actual pipeline failure you owned: affected consumers, first detection, competing hypotheses, containment, validation and the change afterward. Distinguish restored job success from restored freshness and correctness. Include the denominator and observation period for any measured improvement; explain colleagues’ contributions rather than attributing the whole project to yourself.

Use the same review habit across exercises: predict output, run the smallest failing case, repair the invariant, and compare against an independent expected result. A query that completes or a green orchestration run does not by itself establish a trustworthy data product.

Frequently asked questions

What should I prepare for a Microsoft Data Engineer interview?

Match the requisition, then practice SQL, data contracts, Python, pipeline recovery and the distributed-processing tools actually named. This guide supplies original incremental-load and skew exercises. PracHub’s small visible company-role bank is not evidence that the job mainly tests URL shorteners.

Will I need to write runnable code?

Microsoft’s technical-interview guidance asks candidates to use a familiar language, write runnable code and test it. The specific Data Engineer format still depends on the role. Confirm the SQL dialect, environment, stages and permitted tools with the recruiter.

Is Microsoft Fabric required for every Data Engineer role?

No universal requirement is established here. Fabric’s data-engineering surface includes lakehouses, pipelines, Spark job definitions and notebooks. Study those when the requisition makes them relevant; other teams may emphasize different systems.

Does committing a watermark prove exactly-once processing?

No. The fixture proves replay-safe state and checkpoint updates within one SQLite database and one ordered partition. A remote source acknowledgement is separate, and external side effects need their own idempotency or reconciliation contract. Child exits do not prove power-loss durability.

Does adding more Spark partitions fix a hot key?

Not by itself when all records for the key still hash together. Inspect the final plan, task distribution and key frequencies. Depending on the join and runtime, consider a safe broadcast, supported AQE skew handling or controlled hot-key salting, and verify output equivalence.

How should I discuss compensation and interview timing?

Use the exact current requisition and recruiter guidance. A matching title does not establish the same level, location, job family, pay range or interview schedule. This revision does not present the older page’s two salary examples as current figures.

Sources and scope

Checked October 9, 2026. SQL and failure results are local exercise observations; Spark timings and plan are fictional diagnosis material. No Microsoft or Fabric environment was executed, and no proprietary hiring requirements are inferred from the examples.

More questions candidates ask

Match the requisition, then practice SQL, data contracts, Python, pipeline recovery and the distributed-processing tools actually named. This guide supplies original incremental-load and skew exercises. PracHub’s small visible company-role bank is not evidence that the job mainly tests URL shorteners.

Microsoft’s technical-interview guidance asks candidates to use a familiar language, write runnable code and test it. The specific Data Engineer format still depends on the role. Confirm the SQL dialect, environment, stages and permitted tools with the recruiter.

No universal requirement is established here. Fabric’s data-engineering surface includes lakehouses, pipelines, Spark job definitions and notebooks. Study those when the requisition makes them relevant; other teams may emphasize different systems.

No. The fixture proves replay-safe state and checkpoint updates within one SQLite database and one ordered partition. A remote source acknowledgement is separate, and external side effects need their own idempotency or reconciliation contract. Child exits do not prove power-loss durability.

Not by itself when all records for the key still hash together. Inspect the final plan, task distribution and key frequencies. Depending on the join and runtime, consider a safe broadcast, supported AQE skew handling or controlled hot-key salting, and verify output equivalence.

Use the exact current requisition and recruiter guidance. A matching title does not establish the same level, location, job family, pay range or interview schedule. This revision does not present the older page’s two salary examples as current figures.

MicrosoftData Engineerinterview guideSQLPythonMicrosoft Fabricsystem designdata engineering