Data Engineering interview questions: ETL & ELT fundamentals

Reviewed by Mark Dickie · Last updated

6 questions on this page you can answer and see marked on the spot. Go to the first one

ETL and ELT are two approaches to moving and transforming data from source systems into a data warehouse or lake, differing mainly in where the transformation step happens. For a Data Engineering interview, you should know the difference between extract-transform-load and extract-load-transform, when each pattern fits, and the trade-offs around processing location, cost, and tooling. You should also be able to explain common pipeline stages, batch versus streaming ingestion, idempotency, and basic data quality checks.

What is the difference between ETL and ELT?

The distinction is simple but interviewers use it to check whether you understand where compute happens and why that matters.

AspectETLELT
Transform locationMiddle tier or dedicated engineInside the target warehouse or lake
When transform runsBefore loadingAfter loading
Typical targetData warehouse, curated martsData lake, cloud warehouse (BigQuery, Snowflake)
Compute modelSeparate transform server or clusterWarehouse-native compute
Best fitOn-prem warehouses, strict schemasCloud warehouses with elastic compute

What pipeline concepts come up in a Data Engineering interview?

  1. Idempotency — re-running a pipeline or task produces the same result without duplicating or corrupting data. Interviewers ask how you guarantee this (e.g., partition overwrites, MERGE statements, checkpointing).
  2. Batch vs streaming ingestion — batch moves data in scheduled chunks; streaming moves records as they arrive. Know when to use each and tools like Airflow for batch, Kafka for streaming.
  3. Schema evolution — what happens when a source column is added, renamed, or dropped. Be ready to discuss forward and backward compatibility.
  4. Data quality checks — null checks, uniqueness, referential integrity, freshness thresholds. Mention frameworks like Great Expectations or dbt tests.
  5. Incremental loading — loading only new or changed records (CDC, watermark columns) rather than full reloads every run.

How should I reason about choosing ETL vs ELT in an interview?

If the target platform has cheap, elastic compute (a cloud warehouse), ELT is usually the better default: you land raw data first, then transform with SQL inside the warehouse where the engine is already tuned for it. If you are loading into a system with limited compute, or the transform requires heavy enrichment from third-party APIs before the data is usable, ETL keeps that work off the warehouse. Interviewers want to see you weigh cost, latency, tooling maturity, and team skill set rather than memorizing a single answer.

Key facts

  • Tarmac has 15 Data Engineering interview questions on this topic, 10 of them on this page, at difficulty 1–5 of 5.
  • Tarmac tracked 1,538 job postings asking for Data Engineering in September 2026.
  • Roles asking for Data Engineering advertise a median base salary of £77,500, across 380 job postings as of September 2026.
  • Tarmac last reviewed these Data Engineering interview questions on 19 October 2026.

At a glance

Questions10 shown · 15 in the bank
Difficulty1–5 of 5
FormatsMultiple choice, Ordering, Multiple answer, Code output, True / false, Find the bug, Fill in the blank, Short answer, Flashcard

What you'll review

  1. batch vs streaming ingestion
  2. etl vs elt

Practice questions

Try one before you open the answer. Pick an option and press Check; it's marked on the spot.

Which use case most clearly calls for streaming ingestion rather than batch ingestion?#

Options

Show answer

Streaming ingestion is the better fit for fraud alerts that must fire within seconds of a transaction. Processing each event as it arrives keeps latency low, whereas a scheduled batch run would deliver the alert too late to stop the fraudulent activity.

Why:

Fraud alerts must fire within seconds of a transaction, so waiting for a scheduled batch run would make the alert useless; streaming ingestion processes each event as it arrives. A monthly finance report, a one-time historical backfill, and an annual archive export all tolerate delay and are naturally handled in scheduled or one-off batch jobs.

Put the steps of a classic ETL (extract, transform, load) batch pipeline into the order they run.#

Put these in order

Show answer

The ETL order is extract, transform, load, then report. Data is pulled from the source, cleaned and reshaped on a separate processing layer, and only then written to the warehouse. Because the warehouse receives finished data, downstream dashboards query tables that are already in their final form.

Why:

In ETL, data is pulled from the source first, then transformed in an intermediate processing layer before anything is written to the warehouse. Only the already-transformed data is loaded, so the warehouse tables are ready to be queried by dashboards last. The transform step must sit between extract and load because the defining feature of ETL is that transformation happens before loading.

A data platform team must choose an ingestion pattern for four workloads. Which of the following workloads are well suited to batch ingestion rather than streaming ingestion? Select all that apply.#

Options

Pick every one that applies.

Show answer

Batch ingestion suits workloads whose consumers only need data on a schedule, such as a next-morning finance report or a monthly file export from a legacy system. Workloads that need results within seconds, such as fraud approval or live inventory counts, call for streaming ingestion instead.

Why:

The morning reconciliation report only needs yesterday's data by the start of the next business day, so a scheduled batch load is sufficient and simpler to operate. The monthly full file export is already a bounded dataset that arrives on a fixed cadence, which is a natural fit for batch. The fraud decision and the live inventory counter both require results within seconds of the event, which requires streaming ingestion rather than a periodic load.

The following Python script uses an in-memory SQLite database to illustrate an ELT-style pipeline: raw rows are loaded first, then transformed inside the database with SQL. What does the script print?#

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE raw_orders (id INTEGER, amount TEXT)")
con.executemany("INSERT INTO raw_orders VALUES (?, ?)",
                [(1, "10"), (2, "x"), (3, "5")])
con.execute("CREATE TABLE orders AS "
            "SELECT id, CAST(amount AS INTEGER) AS amount "
            "FROM raw_orders WHERE amount GLOB '[0-9]*'")
print(con.execute("SELECT COUNT(*), SUM(amount) FROM orders").fetchone())
Show answer
(2, 15)
Why:

All three raw rows are loaded unchanged into raw_orders, with amount stored as TEXT. The transform step is a SQL CREATE TABLE ... AS SELECT that runs inside the database. The GLOB filter '[0-9]*' keeps only amounts beginning with a digit, so the value 'x' is dropped and the values '10' and '5' remain. Casting them to INTEGER gives 10 and 5, so orders contains 2 rows whose amounts sum to 15. fetchone returns the tuple (2, 15), which prints as (2, 15).

True or false: If a batch ingestion job is rerun over the same immutable source files and writes into the target table with an idempotent MERGE keyed on a business identifier, the final table state is the same as after the first successful run.#

Options

Show answer

True. A batch job rerun over the same immutable source files, written with an idempotent MERGE on a business key, yields the same final table state as the first successful run. Matching rows are updated and missing rows inserted, so no duplicates accumulate, which is why such reruns are safe to retry after a partial failure.

Why:

Because the source files are immutable, the rerun presents the same input rows. A MERGE keyed on a business identifier updates existing rows and inserts missing ones, so repeating it converges to the same final state instead of duplicating rows. This idempotency is what makes batch reruns safe for retry after partial failure, and it is the property the statement describes.

This Python transform stage is meant to keep only orders whose status is shipped or returned, convert cents to dollars, and pass the result to the load step. Which option identifies the bug that causes the stage to misbehave?#

def transform_orders(rows):
    out = []
    for r in rows:
        if r["status"] == "shipped" or "returned":
            out.append({
                "order_id": r["order_id"],
                "amount_usd": r["amount_cents"] / 100,
            })
    return out

Options

Show answer

The condition r["status"] == "shipped" or "returned" is always truthy because the non-empty string "returned" is truthy, so every row is kept regardless of status.

Why:

The condition is parsed as (r["status"] == "shipped") or "returned". The right-hand operand is the non-empty string "returned", which is truthy, so the whole expression is always truthy and every row is appended regardless of its status. The intended check is r["status"] in ("shipped", "returned"). The other claims are wrong: append correctly adds a dictionary to the list, rows being a list means iterating it directly is correct, and the function does return out.

A team extracts source data, applies cleaning and business logic on a separate processing server, and only then writes modeled rows into the warehouse. This is the _____ pattern. A different team lands the untouched source extracts in the warehouse first and rebuilds modeled tables later with SQL running inside the warehouse engine. This is the _____ pattern.#

Show answer

A team extracts source data, applies cleaning and business logic on a separate processing server, and only then writes modeled rows into the warehouse. This is the ETL pattern. A different team lands the untouched source extracts in the warehouse first and rebuilds modeled tables later with SQL running inside the warehouse engine. This is the ELT pattern.

Why:

The defining difference is where the transform step runs relative to the load. ETL transforms data in an intermediate processing tier before it reaches the warehouse, so only the transformed result is loaded. ELT loads raw data into the warehouse first and uses the warehouse's own compute to transform it, which keeps raw history available for reprocessing and lets the warehouse's scalable engine do the transformation work. Both blanks are the standard acronyms for these two orderings.

A streaming ingestion job reads mobile click events from a log and aggregates them into 1-minute tumbling windows keyed by the event's own timestamp (event time), then writes counts to a warehouse table. Mobile clients buffer events while offline, so some events arrive up to 10 minutes after their event time. Describe how you would configure the job so the per-minute counts become correct, and state the main trade-off you accept compared with a nightly batch job that reprocesses a full day of data.#

Show answer

Set a watermark on event time with a delay of roughly 10 minutes so the engine does not declare a 1-minute window complete until event time has advanced 10 minutes past the window end. Events delayed up to 10 minutes by the mobile buffer therefore arrive while the window is still open and are counted as on-time data. Configure allowed lateness as a separate grace period (for example a few additional minutes) that keeps a window's state open AFTER the watermark has already passed the window end, so any events arriving later than the watermark bound can still update the window; the sink upserts the corrected row (keyed by window start and dimensions). Events arriving beyond allowed lateness are dropped or routed to a side output for a periodic correction job. The trade-off versus a nightly batch job is freshness versus completeness: the stream delivers each minute's count roughly 10 minutes after the minute ends, but events arriving later than the allowed-lateness bound are not reflected without a separate correction path, whereas a nightly batch reprocesses all data at once so nothing is dropped but results are hours old.

Why:

The key is that streaming windows must be closed by a watermark, which is a heuristic about event-time progress. A watermark delay of roughly 10 minutes means a window's end is not declared reached until event time has advanced 10 minutes past it, so events delayed by the mobile buffer arrive while the window is still open and are counted as on-time data. Allowed lateness plays a different role: it keeps the window's state open AFTER the watermark has already passed the window end, so events arriving later than the watermark bound can still update the already-emitted result through an idempotent sink (upsert keyed by window start and dimensions). Events arriving beyond the allowed-lateness grace period are dropped or sent to a side output for correction. The accepted cost versus a nightly batch is that the watermark delay adds latency before each window is final, and events later than the allowed-lateness bound may be missed without a separate correction path, whereas batch reprocesses everything at once but delivers results hours later.

In an event-time streaming pipeline, what does a watermark with value W assert, and what happens to an event whose event timestamp is earlier than W when it arrives?#

Show answer

A watermark W asserts that the engine does not expect any further events with event time less than or equal to W, so event-time windows ending at or before W can be finalized. An event arriving with event time earlier than W is late: it is dropped by default, or handled by the operator's allowed-lateness setting (re-firing the window) or routed to a side output, depending on configuration.

Why:

A watermark is the engine's progress estimate for event time, typically derived as the maximum observed event time minus an allowed out-of-orderness bound. It is what allows windows to close and emit results despite unbounded input, because the system commits to not expecting older events. Consequently an event below the watermark has missed the window's completion point; what happens next is a policy choice (drop, allowed lateness with updates, or side output) rather than an automatic correction. The key point is that watermarks trade completeness against latency: a larger bound admits more late data at the cost of delayed results.

A healthcare analytics team must guarantee that raw, unmasked patient identifiers are never written to the cloud data warehouse, including its internal storage, time-travel history, and fail-safe copies. Which pipeline design meets this requirement?#

Options

Show answer

Mask before loading. To keep raw patient identifiers out of a warehouse entirely, including its time-travel and fail-safe copies, the transformation must run before the load. An ETL step that tokenizes identifiers in a separate service means only masked values are ever persisted in the warehouse.

Why:

The requirement is about what is persisted, not who can read it. In ELT, raw data is loaded into the warehouse first, so the raw identifiers are written to storage no matter what access controls or masking policies are applied afterward; restricted schemas and dynamic masking only govern reads, and time travel and fail-safe retain prior versions of stored data. Only an ETL design that tokenizes or masks identifiers in an external transformation service before the load ensures the warehouse never stores the raw values. That is why tokenizing in a transformation service before loading is the only option that satisfies the guarantee.

Related interview questions

Job market

See data-engineering salaries and hiring demand from live job postings.

The other 5 questions

This page shows 10 and marks what you pick. That's as far as a page can go. A free account opens the other 5 and keeps every answer. What you miss comes back until it's right: after a day, then at longer gaps.

Start with this topic

Free · the whole bank · 100 marked answers per 30 days · written feedback on the paid plan

Interview booked? Practise the job ad instead

What moved, monthly

One email a month when the bulletin comes out: what moved in the markets we track, and the new question topics we published. Confirm your address to join. Unsubscribe any time.