Skip to main content

Lyft

ETL engineer at Lyft

Lyft interviews test coding, distributed system design, and marketplace dynamics, with attention to fraud controls and operational thinking around safety and regional regulations. Design rounds usually reflect rideshare and mapping problems specific to the network.

Process timeline

  1. 1

    Recruiter screen

    Background and level.

  2. 2

    Coding (x2)

    Algorithms with clean code.

  3. 3

    System design

    Marketplace, matching, and mapping at scale.

  4. 4

    Behavioral

    Ownership, safety thinking, and collaboration.

What Lyft looks for

What they value

  • Marketplace and matching design depth
  • Awareness of fraud and safety constraints
  • Practical reasoning about regional rules

Culture signals

  • Care for rider and driver safety
  • Operational thinking at marketplace scale
  • Community and people-first framing

Interview questions

ETL engineer questions worth preparing alongside the Lyft rounds described above, drawn from our etl engineer question bank.

As asked

You own a daily ETL job that loads orders from an upstream API into the warehouse. Yesterday's job failed halfway through and will be retried. How do you make the pipeline idempotent?

Sample answer outline

A strong answer defines the target invariant first: re-running the job for the same logical window should produce the same final table state, not duplicate rows or partial totals. Use a stable business key such as order_id, write into a staging table, validate counts and required columns, then merge into the target inside a transaction or partition swap. Track high-water marks separately from successful commits so a failed run does not advance the cursor. Candidates often trip up by relying only on append-only loads or by deleting a partition before they know the replacement data is complete.

Expect these follow-ups

  • How would your answer change if the source sends updates to old orders?
  • What metadata would you store for each pipeline run?
  • How do you recover if the warehouse supports no multi-statement transaction?
idempotencydata-pipelinesrecovery

As asked

Walk me through how you design an ETL load step so it can be safely re-run without duplicating or corrupting data. What patterns do you rely on, and where do they break down?

Sample answer outline

Strong answers cover MERGE/UPSERT vs. delete-then-insert strategies, using a natural or surrogate key to detect existing rows, and how staging tables isolate uncommitted writes. Candidates should mention where idempotency breaks down: sequence-generated keys, non-deterministic UUIDs at source, or sinks that lack ACID guarantees like S3 plus Athena.

Expect these follow-ups

  • How do you handle sources that emit the same record with different timestamps on each pull?
  • What changes if the target warehouse is BigQuery versus Postgres?
idempotencyetlupsertstagingdata-quality

As asked

You are pulling data from a transactional Postgres database into a data warehouse. Compare timestamp-based incremental extraction with CDC via Debezium. When would you choose each, and what are the failure modes of the timestamp approach?

Sample answer outline

Timestamp extraction is simpler but misses deletes, is vulnerable to clock skew, breaks if updated_at is not indexed or is missing from some tables, and can lose rows during the overlap window if not handled carefully. CDC via Debezium reads Postgres WAL, captures inserts, updates, and deletes with low latency, but requires WAL level set to logical and adds operational overhead. The choice depends on whether deletes matter and whether the source schema is stable.

Expect these follow-ups

  • What happens to your timestamp-based job if the source database has a maintenance window that causes a 4-hour gap?
cdcdebeziumpostgresincremental-loadextraction

As asked

You are building a daily load from an external vendor into your warehouse. The vendor has a history of sending files with missing columns, out-of-range values, and duplicate primary keys. How do you build data quality into the pipeline, and what happens when a check fails mid-run?

Sample answer outline

Strong answers describe using a framework like Great Expectations or dbt tests to validate after staging but before promotion to the production table. Candidates should explain quarantine patterns where bad rows go to a rejected table with error metadata, and discuss whether the pipeline should halt or continue with clean rows depending on business rules. They should also mention alerting and how to give the data team visibility into failure rate trends.

Expect these follow-ups

  • How do you decide whether a 2% duplicate rate should fail the pipeline or trigger a warning?
data-qualitygreat-expectationsdbt-testspipeline-design

As asked

Write a Python function that takes a list of event dictionaries, each with an 'id' and a 'ts' (Unix timestamp), and returns a list containing only the most recent record for each id. Optimize for the case where the list has millions of records.

Sample answer outline

A single-pass O(n) solution using a dict keyed by id and comparing ts values is the right answer. Candidates should avoid sorting the entire list first which is O(n log n). Bonus for noting that the dict approach works in constant space relative to unique keys and handles ties consistently.

Reference implementation (python)

Python
def deduplicate(records: list[dict]) -> list[dict]:
    # records = [{'id': 'a', 'ts': 1000}, {'id': 'a', 'ts': 2000}, ...]
    latest = {}
    for rec in records:
        rid = rec['id']
        if rid not in latest or rec['ts'] > latest[rid]['ts']:
            latest[rid] = rec
    return list(latest.values())

Expect these follow-ups

  • How would you parallelize this if the records were spread across 100 files on S3?
pythondeduplicationdictionariesetlalgorithms

As asked

Write a Python generator that takes an iterable of arbitrary size and a chunk_size, and yields lists of up to chunk_size items. Use this to batch insert rows into Postgres without loading all rows into memory at once.

Sample answer outline

The generator should use islice or a simple accumulator loop and yield each batch. Strong answers note that generators are memory-efficient for large inputs and that the caller controls back-pressure by consuming one batch at a time. They should also mention that psycopg2's execute_values is more efficient than looping execute for Postgres inserts.

Reference implementation (python)

Python
from itertools import islice

def chunked(iterable, chunk_size: int):
    it = iter(iterable)
    while True:
        batch = list(islice(it, chunk_size))
        if not batch:
            break
        yield batch

# Usage:
# for batch in chunked(rows, 1000):
#     cursor.executemany(sql, batch)

Expect these follow-ups

  • How does your solution behave if the iterable raises an exception halfway through?
pythongeneratorspostgresbatch-insertmemory-efficiency

ETL engineer interview detail at Lyft

How the Lyft loop applies to ETL engineer candidates

Lyft is a big-tech employer headquartered in San Francisco, and the same 4-stage process described above is what a etl engineer candidate walks through, with the technical stages tuned to the data discipline. Lyft interviews test coding, distributed system design, and marketplace dynamics, with attention to fraud controls and operational thinking around safety and regional regulations. Design rounds usually reflect rideshare and mapping problems specific to the network.

For a etl engineer, the load concentrates on coding (x2) and system design. Those are the stages where the data signal is read most closely, so they are where preparation pays off most. The non-technical stages (recruiter screen and behavioral) still gate the offer, but they assess fit and communication rather than role-specific depth.

What the etl engineer question mix signals

The 6 most-reported etl engineer questions cluster around role-specific (4), coding (2). That distribution is the clearest read on what Lyft actually probes for this role: the more a topic recurs, the more reliably it shows up in the loop, so it is worth weighting practice the same way.

The set spans a easy-to-medium difficulty range, topping out at medium problems. Because the topics are concentrated rather than scattered, depth in the leading area matters more than breadth for this particular role.

What moves a etl engineer offer forward at Lyft

Across the loop, the traits that consistently move a Lyft etl engineer offer forward are marketplace and matching design depth, awareness of fraud and safety constraints, and practical reasoning about regional rules. These are not abstract values; interviewers score against them, so a etl engineer who demonstrates them explicitly - naming the tradeoff, stating the assumption, checking the edge case out loud - reads stronger than one who only reaches the right answer silently.

The behavioral and culture stages are checking for care for rider and driver safety, operational thinking at marketplace scale, and community and people-first framing. For a etl engineer, the most credible way to show these is through specific, recent examples from real data work rather than rehearsed generalities.

Salary band

Use the salary page linked below for etl engineer bands by city, modeled from BLS, ONS, and Levels.fyi reference medians.

View salary detail

Similar companies