Netflix Data Engineer (Mid-Level) Interview Preparation Guide 2026
Netflix's Data Engineer interview process for mid-level candidates consists of 7 rounds designed to evaluate technical depth, system design thinking, and cultural alignment. The process begins with recruiter screening, moves through a technical phone screen, and concludes with 5 onsite rounds covering SQL/data modeling, ETL/big data, system design, and behavioral assessment. The entire process typically spans 4-6 weeks and evaluates your ability to design and optimize scalable data pipelines at Netflix's massive scale, work with distributed systems, collaborate across teams, and align with Netflix's 'Freedom & Responsibility' culture.
Interview Rounds
Recruiter Screening
What to Expect
Your initial conversation with a Netflix recruiter. This round combines the initial screening call and follow-up recruiter discussion. The recruiter will review your background, verify your experience matches the role level, discuss your interest in Netflix, and clarify the position and interview process. They'll assess culture fit and ensure your career goals align with the role. For mid-level candidates, expect discussion of your project leadership, mentoring of junior engineers, and contributions to team decisions.
Tips & Advice
Prepare a concise 2-3 minute summary of your career highlighting key data engineering projects and technical achievements. Be specific about your role and impact—use metrics when possible (e.g., 'reduced ETL latency by 40%' rather than 'improved performance'). Research Netflix's business and demonstrate genuine interest in how data powers personalization. Have thoughtful questions ready about the team, projects, and technical culture. Clarify expectations around on-call, remote work, and team structure. At mid-level, emphasize examples where you led projects or mentored junior engineers.
Focus Topics
Questions About Netflix, the Role & Team
Prepare 3-5 thoughtful questions that demonstrate your research and genuine interest. Ask about the specific team you'd join, current technical challenges, team structure and mentorship approach, or Netflix's data platform roadmap. Avoid generic questions that could apply to any company. Good questions might explore: 'What are the biggest data engineering challenges you're facing this year?' or 'How does the team balance building new capabilities vs. maintaining existing pipelines?'
Practice Interview
Study Questions
Collaboration & Cross-Functional Impact
Share examples of working with data scientists, analytics teams, product managers, or other engineering teams. Describe how you ensured data engineers' solutions met downstream users' needs. Discuss communication of complex technical concepts to non-technical stakeholders. Highlight instances where your work enabled others to be more effective. For mid-level, show evidence of growing your ability to influence others.
Practice Interview
Study Questions
Project Leadership & Ownership
For mid-level candidates, describe 2-3 projects where you owned end-to-end delivery, not just contributed code. Explain how you drove design decisions, managed trade-offs between technical elegance and shipping speed, and collaborated with stakeholders. Discuss how you handled project challenges and made decisions when faced with competing priorities. Show examples of taking initiative beyond assigned tasks.
Practice Interview
Study Questions
Motivation for Netflix & Role Understanding
Articulate why you want to work at Netflix specifically, not just any tech company. Demonstrate understanding of Netflix's streaming business, global scale, and reliance on data for recommendations and content strategy. Show knowledge of Netflix's data engineering challenges (real-time personalization, massive scale, international complexity). Ask informed questions about the specific team, their current projects, and technical challenges. Express genuine interest in solving Netflix's data problems.
Practice Interview
Study Questions
Career Background & Data Engineering Experience
Discuss your 2-5 years of data engineering experience, focusing on production systems you've built. Highlight projects involving data pipelines, ETL processes, and working with large datasets. For mid-level, emphasize your progression from individual contributor to owning end-to-end projects. Be prepared to discuss technologies used (Spark, Hadoop, Python, Scala, cloud platforms) and measurable business impact. Explain what drew you to data engineering and how your experience has evolved.
Practice Interview
Study Questions
Technical Phone Screen
What to Expect
A 30-45 minute remote conversation focused on your hands-on technical skills. The interviewer will ask SQL questions (writing queries to solve specific data problems), discuss your experience with data engineering technologies, and potentially include a simple coding exercise. This round assesses whether you can translate requirements into SQL, understand data relationships, and communicate your approach clearly. Expect questions about your past projects with emphasis on technical decisions and problem-solving approach.
Tips & Advice
Write SQL queries on a shared document or whiteboard tool—practice beforehand so you're comfortable with the interface. Think aloud as you work through problems; interviewers value clear reasoning over speed. Start with simple queries, then add complexity with joins, aggregations, or window functions. If stuck, ask clarifying questions ('Can I assume the data is clean?' 'What's the expected volume?'). For mid-level, expect questions requiring more complex SQL than entry-level but don't need to be as deep as senior rounds. Practice explaining your approach concisely—'I'd use a window function here because...' Structure answers: understand the problem → write the query → consider edge cases → optimize if needed.
Focus Topics
Communication & Explanation Skills
Clearly explain your solutions and reasoning. Don't just write code/queries—explain what you're doing and why. When asked 'How would you optimize this?', give your reasoning: 'I'd add an index on the join key because lookups are currently O(n), and adding an index makes it O(log n) in the best case.' Use drawings or pseudocode if helpful. Ask clarifying questions when requirements are ambiguous. At mid-level, interviewers expect you to explain technical concepts to both technical and non-technical audiences.
Practice Interview
Study Questions
Data Engineering Problem-Solving Approach
Demonstrate your systematic approach to data problems. Discuss how you break down requirements, consider data quality issues, think about edge cases, and optimize solutions. Walk through a real example from your work: 'We needed to identify duplicate records; I considered update frequency, data volume, and what duplicate meant—we ended up using a hash of key fields to detect soft duplicates.' At mid-level, show that you think beyond 'just make it work'—consider scalability, maintainability, and business impact.
Practice Interview
Study Questions
Past Projects & Technical Decisions
Prepare 2-3 concrete examples of data engineering projects you've worked on. For each: What was the business problem? What data did you work with and at what scale? What was your role and what did you build? What technologies did you use and why? What challenges did you face and how did you solve them? What was the business impact? At mid-level, you should have examples of projects you owned end-to-end or led specific components. Be ready to discuss technical trade-offs: 'We could have used Spark, but chose SQL because the data fit in memory and we needed faster development.'
Practice Interview
Study Questions
Experience with Data Engineering Technologies
Discuss your hands-on experience with specific technologies: Spark (PySpark or Scala), Hadoop, Python/Scala programming, cloud platforms (AWS/GCP/Azure), SQL databases, NoSQL systems, workflow orchestration tools. For each technology, be specific: 'I used Spark for ETL jobs processing 10TB of daily data' rather than just listing tools. Explain why you chose certain technologies for specific problems and what you learned. At mid-level, you should have deep experience with at least 2-3 core technologies and working knowledge of others.
Practice Interview
Study Questions
SQL Query Writing - Fundamentals & Joins
Write SQL queries to extract and analyze data from relational databases. Master SELECT, WHERE, GROUP BY, ORDER BY, HAVING clauses. Understand INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN—know when to use each and how they handle nulls. Write queries combining multiple tables and filtering appropriately. Handle NULL values correctly. For mid-level, be comfortable with 2-4 table joins and explaining why you chose a particular join type. Practice queries like 'Find users who never made a purchase' (using LEFT JOIN with NULL check) or 'Top 10 products by revenue last quarter'.
Practice Interview
Study Questions
Onsite Round 1: SQL, Window Functions & Data Manipulation
What to Expect
First onsite technical round (1-2 hours) focused on advanced SQL and data manipulation. You'll solve practical data queries using window functions, aggregations, subqueries, and complex joins. Expect problems like 'Find the top 5 products by revenue in each region' or 'Calculate the number of days between consecutive user purchases'. This round tests whether you can write efficient SQL to solve real-world Netflix problems like analyzing user behavior, content performance, and recommendation accuracy. You'll likely code in a collaborative environment with an interviewer present.
Tips & Advice
Window functions are critical—practice ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM() OVER (), and similar functions extensively. Understand the difference between ROW_NUMBER and RANK (ties handling). Be comfortable with CTEs (WITH clauses) to make complex queries readable. Practice writing multiple solutions: first get a correct answer, then optimize for performance. Consider how you'd test your query—what edge cases exist? Null values? Empty result sets? For mid-level, interviewers expect you to not just write working SQL but to think about performance and suggest optimizations. Use EXPLAIN PLAN if available. Time complexity matters—explain why your approach scales with larger datasets.
Focus Topics
Query Optimization & Performance Considerations
Discuss why your query is efficient or how you'd optimize it. Understand indexes: uniqueness constraints, composite indexes, covering indexes. Recognize N+1 query problems. Discuss query plans—explain what full table scans vs. index lookups mean. For mid-level, you're not expected to be a DBA, but you should recognize obviously slow queries and suggest improvements. Example: joining on non-indexed columns, selecting unnecessary columns, or multiple GROUP BYs that could be combined.
Practice Interview
Study Questions
Data Quality & Edge Case Handling
Consider NULL values, duplicates, and edge cases in queries. NULL comparisons require IS NULL/IS NOT NULL, not = NULL. Understand how NULLs affect joins and aggregates. Handle empty result sets. For Netflix-specific: handle cases where users have no views, deals with timezone differences, or handles subscription gaps. At mid-level, you should proactively mention edge cases: 'This query assumes users have at least one purchase, but I'd use LEFT JOIN and handle NULLs if we need all users.' Write defensive SQL.
Practice Interview
Study Questions
Aggregation, Grouping & Having Clauses
Write GROUP BY queries with multiple aggregation functions (COUNT, SUM, AVG, MIN, MAX). Use HAVING clause to filter grouped results (different from WHERE which filters before grouping). Solve problems like 'Find users with >5 purchases last month', 'Count movies per genre, only show genres with >100 movies'. Understand the order: WHERE filters rows, GROUP BY groups them, aggregates summarize groups, HAVING filters groups. For mid-level, combine these with JOINs and window functions in the same query.
Practice Interview
Study Questions
Common Table Expressions (CTEs) & Subqueries
Use WITH clauses to create CTEs, making complex queries more readable. Solve multi-step problems by breaking them into CTEs. Example: 'WITH recent_users AS (SELECT * FROM users WHERE created_date > '2025-01-01') SELECT * FROM recent_users WHERE...'. Understand when CTEs improve readability vs. when they're unnecessary. Know the difference between scalar subqueries (return single value), row subqueries (single row), table subqueries (multiple rows/columns), and correlated subqueries (reference outer query). For mid-level, nested CTEs are acceptable but ensure queries remain readable.
Practice Interview
Study Questions
Window Functions & Ranking Queries
Master window functions: ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM/AVG/COUNT OVER (). Understand PARTITION BY and ORDER BY within windows. Solve problems like: 'Number each user's purchases in order', 'Find the previous purchase amount for each user', 'Rank products by rating within each category'. Know when to use RANK vs DENSE_RANK (RANK creates gaps for ties, DENSE_RANK doesn't). Window functions are essential for time-series analysis and Netflix's recommendation systems that analyze user viewing patterns over time.
Practice Interview
Study Questions
Complex Joins & Multi-Table Queries
Write queries joining 3+ tables with different join types. Understand performance implications of different join orders. Use INNER JOIN for strict matching (e.g., users who definitely have subscription), LEFT JOIN to keep all records from left table (e.g., all users, null if no subscription), RIGHT/FULL OUTER JOIN for less common but important cases. Solve problems like 'Find movies watched by users who never subscribed' (requires multiple conditions and join logic). For mid-level, also consider: 'Which join executes first in a chain? Why?' Be ready to optimize slow queries.
Practice Interview
Study Questions
Onsite Round 2: Data Modeling & Warehouse Architecture
What to Expect
Second onsite technical round (1-2 hours) focused on data modeling, warehouse design, and schema architecture. You'll discuss conceptual models, dimensional modeling (fact and dimension tables), normalization vs. denormalization trade-offs, and designing schemas for specific use cases. Expect questions like 'Design a schema to track Netflix viewing history optimized for analyzing viewing patterns' or 'Would you use star schema or snowflake schema for user subscription data and why?'. This round assesses whether you understand how data is organized for analysis and can design efficient, scalable warehouses.
Tips & Advice
Know dimensional modeling cold: understand fact tables (granular, business measurements) vs. dimension tables (attributes, relatively static). For Netflix: a fact table might be user_viewing_events (who watched what when), dimension tables might be users, content, dates. Star schema is a fact table surrounded by dimensions; snowflake schema is normalized dimensions. Be ready to draw schemas on a whiteboard. Discuss trade-offs: denormalization improves query performance but risks data consistency; normalization prevents redundancy but requires more joins. For mid-level, explain your reasoning: 'I'd denormalize user metadata into the fact table because we always analyze by these attributes and the query performance gain outweighs the storage cost.' Discuss scalability—how does the schema perform as data grows? Can you partition tables? Do you need sharding?
Focus Topics
Data Freshness, Slowly Changing Dimensions & Data Evolution
Discuss how dimensions change over time. Type 1 (overwrite old values), Type 2 (keep history with effective dates), Type 3 (keep current and previous). Choose based on analysis needs. Netflix user demographics might use Type 2 (need to know what they looked like at viewing time). Content ratings might use Type 1 (only current rating matters). Discuss schema evolution: How do you add a new attribute without breaking existing pipelines? At mid-level, you should think about backward compatibility and versioning strategy.
Practice Interview
Study Questions
Scalability, Partitioning & Performance Optimization
Design schemas that scale to Netflix's petabyte scale. Discuss partitioning strategies: by date (most common for time-series data like viewing events), by region, by user segment. Partitioning enables parallel processing, faster queries, and easier data deletion/archival. Choose partition granularity carefully—daily is common, but hourly might be needed for high-volume data. Discuss table optimization: compression, indexing, materialized views. For mid-level, consider: 'As data grows from 1TB to 100TB, what breaks? How would you redesign?' Would you change from a data warehouse to data lake? Use columnar formats like Parquet?
Practice Interview
Study Questions
Normalization vs. Denormalization Strategies
Normalization (1NF, 2NF, 3NF, BCNF) reduces redundancy and maintains consistency—but requires joins at query time. Denormalization adds redundancy for query performance—but risks data inconsistency if not updated correctly. Discuss trade-offs: 'We denormalize user subscription status into every viewing event because we query by this frequently and the slight redundancy is acceptable given our data refresh frequency.' At mid-level, you should explain specific denormalization decisions with reasoning. When would you NOT denormalize? Slowly-changing dimensions require careful handling in denormalized systems.
Practice Interview
Study Questions
Designing Schemas for Netflix Use Cases
Design schemas for specific Netflix scenarios: 'Design a schema to support analyzing which content drives new subscriptions', 'Schema for recommendation engine training', or 'Schema for churn prediction'. Break down the requirement: What events matter? What attributes do we need? At what granularity? What queries will we run? What's the data volume? Design iteratively—start simple, then refine. For mid-level candidates, interviewers expect you to ask clarifying questions: 'How often will this be queried? What's the data volume? Do we need real-time or batch updates?' Then justify your design choices.
Practice Interview
Study Questions
Star Schema vs. Snowflake Schema Trade-offs
Star schema has a fact table with direct links to denormalized dimensions (all attributes in one table). Snowflake schema further normalizes dimensions (e.g., dim_date might reference dim_month which references dim_year). Star schema is simpler, fewer joins, faster queries—but dimensions are denormalized, using more storage. Snowflake saves storage, maintains data consistency—but requires more joins. Discuss when you'd choose each. For Netflix: viewing events with user demographics might use star schema (dimensions are relatively small, queries need user attributes immediately). But subscription tiers that change frequently might use snowflake to maintain consistency.
Practice Interview
Study Questions
Dimensional Modeling & Fact/Dimension Tables
Understand dimensional modeling for analytics. Fact tables contain granular business events (measurements) with foreign keys to dimensions. Dimension tables contain attributes (slowly-changing dimensions). For Netflix: user_viewing_events could be a fact table (user_id, content_id, watch_date, viewing_duration, country), with dimensions like dim_user (demographics), dim_content (genre, release_date), dim_date (day_of_week, month). Design fact tables at the right granularity—too granular is slow, too coarse loses detail. For mid-level, discuss whether you'd add derived columns for common queries (e.g., is_completed) or keep tables minimal.
Practice Interview
Study Questions
Onsite Round 3: ETL Design, Spark & Big Data Technologies
What to Expect
Third onsite technical round (1.5-2 hours) focusing on ETL pipeline design, Apache Spark, Hadoop, and big data processing technologies. You'll design data ingestion and transformation pipelines, discuss Spark architecture and optimizations, and solve problems like 'Design an ETL to process Netflix viewing logs from millions of devices daily'. Expect questions about map-reduce, distributed processing, handling late-arriving data, and optimization techniques. This round assesses your production experience with large-scale data systems.
Tips & Advice
Know Spark fundamentals: RDDs vs. DataFrames, lazy evaluation, actions vs. transformations, catalyst optimizer. Understand Spark's distributed execution: driver, executors, shuffle operations, and why they're expensive. For ETL: discuss data ingestion (batch vs. real-time), transformations (cleaning, enrichment, joins), and loading to warehouse/lake. Discuss failure handling, idempotency, and monitoring. Practice thinking at scale: 'If we process 1TB daily, how long should this ETL take? If it takes 2 hours now but data grows 10x, what bottleneck appears first?' Be ready to write PySpark code or pseudocode. For mid-level, optimization thinking is crucial: 'This shuffle is expensive because we're joining on an unskewed key; I'd broadcast the smaller table instead.'
Focus Topics
Spark Performance Optimization & Tuning
Optimize Spark jobs: Choose DataFrames over RDDs. Use appropriate joins (broadcast for small tables, sort-merge for large). Minimize shuffles—repartition only when necessary. Use columnar formats (Parquet) instead of row-based (CSV). Partitioning strategy: right number of partitions avoids too much memory usage per executor. Caching intermediate results reduces recomputation. For mid-level, understand trade-offs: 'Broadcasting saves shuffle cost but requires enough memory; sort-merge uses disk but handles larger tables.' Discuss monitoring: which operations trigger shuffles? Where is time spent? Use Spark UI to understand execution.
Practice Interview
Study Questions
Handling Data Quality, Late Data & Idempotency
Real data is messy. Design pipelines to handle: null/missing values, duplicates, late-arriving events (user event captured hours later than real time), out-of-order events, schema mismatches. Implement validations: check row counts match expectations, validate schemas, detect duplicates. Discuss deduplication strategies: exact matches (deterministic), fuzzy matching (approximate), or event IDs. For Netflix: viewing events might arrive 12 hours late; design pipelines accordingly. Idempotency: running the same ETL twice produces same result—avoid double-counting or inserting duplicates.
Practice Interview
Study Questions
Map-Reduce & Distributed Computing Fundamentals
Understand map-reduce paradigm even if you use Spark. Map: apply function to each element, Reduce: combine elements with same key. Shuffle: moving data between nodes to group by key. Most Spark operations are abstractions over map-reduce. For example, `groupBy('user_id').sum()` is essentially: map each row to (user_id, amount), shuffle to group user_ids, reduce by summing amounts. At mid-level, you should explain: 'Shuffles are expensive because data moves between nodes; minimize them by pre-filtering or using repartition strategically.' Understand why map-reduce is powerful: parallelizable across thousands of machines.
Practice Interview
Study Questions
PySpark & Spark SQL for Data Transformation
Write PySpark code for common transformations. Use DataFrame API: selecting columns, filtering, joining, grouping, aggregating. Use Spark SQL for queries. Understand when to use DataFrames (usually) vs. RDDs (rare, only if you need low-level control). For mid-level, write multi-step transformations combining selections, joins, and aggregations. Example: 'Load viewing events, join with content metadata, filter for last 30 days, group by content, calculate metrics.' Discuss performance: broadcasting small tables for joins, salting skewed keys, partitioning output by date.
Practice Interview
Study Questions
Apache Spark Architecture & Distributed Processing
Understand Spark architecture: driver submits jobs, cluster manager allocates resources, executors run tasks in parallel. Data is distributed across partitions; processing happens partition-by-partition. Key concepts: RDDs (immutable, lower-level), DataFrames (higher-level, optimized), lazy evaluation (transformations aren't executed immediately), and actions (triggering execution). Understand transformations (map, filter, join, groupBy) vs. actions (collect, write, count). For mid-level, explain Spark's Catalyst optimizer: 'Spark rearranges operations to minimize data movement—it pushes filters down before joins to reduce data size.'
Practice Interview
Study Questions
ETL Process Design & Data Pipeline Architecture
Design end-to-end ETL (Extract, Transform, Load) pipelines. Extract: How do you ingest data? Batch from databases/files or streaming from Kafka? Transform: How do you clean, validate, and enrich data? Join multiple sources? Aggregate? Load: Where does processed data go—data warehouse, data lake, cache? Discuss the pipeline architecture: schedulers (Airflow, Spark), monitoring, error handling, recovery. For Netflix-specific: design a pipeline ingesting viewing events from millions of devices worldwide. Handle late-arriving events, duplicates, and volume spikes. At mid-level, you should have built at least one end-to-end pipeline in production and understand lessons learned.
Practice Interview
Study Questions
Onsite Round 4: System Design - Data Pipeline Architecture
What to Expect
Fourth onsite technical round (1.5-2 hours) focused on system design at Netflix scale. You'll architect end-to-end data solutions to solve complex Netflix problems. Example prompt: 'Design a data pipeline to ingest, process, and make available Netflix viewing data from 200+ million devices worldwide in real-time for personalization algorithms.' You'll discuss architecture components (data sources, ingestion, storage, processing, serving), technology choices, scalability, reliability, trade-offs, and bottlenecks. This round assesses your ability to design systems that balance competing concerns: performance, scalability, reliability, cost, and maintainability.
Tips & Advice
System design is exploratory; clarify requirements first. Ask: What's the data volume? What's the latency requirement? Who are the users (data scientists, real-time recommendations, dashboards)? How often is data read vs. written? Start with a simple architecture, then iterate addressing concerns. Netflix's scale is extreme: 200M+ users, petabytes of data daily. Design accordingly. Discuss each component: Ingestion (Kafka for real-time events, databases for batch dumps), Processing (Spark for batch, Storm/Flink for streaming), Storage (S3 for raw, warehouse for processed, cache for serving). Trade-offs appear everywhere: real-time vs. batch (real-time is complex; batch is simpler but stale), consistency vs. availability, cost vs. performance. For mid-level, you should explain reasoning, not just list technologies. 'We'd use Kafka because it handles millions of events/second and decouples producers from consumers, absorbing volume spikes.' Draw diagrams. Discuss failure modes: what if Kafka goes down? How do you recover? What if a transformation job fails? These show mature thinking.
Focus Topics
Reliability, Failure Handling & Data Consistency
Design for failure: If Kafka producer fails, how do you recover events? If processing job crashes, do you lose data? Use idempotent operations: reprocessing data produces same results. Implement exactly-once semantics where needed (billing), at-least-once elsewhere (recommendations). Design monitoring and alerting: alert if event lag exceeds threshold. Implement checkpointing in streaming jobs. At Netflix: losing personalization data for hours might be acceptable (use stale model), but losing billing data is unacceptable. Design different reliability levels for different data. At mid-level, you should think about failure modes proactively.
Practice Interview
Study Questions
Trade-offs: Cost, Latency, Consistency, Complexity
Every architectural choice involves trade-offs. Real-time is more expensive (always-running Spark, continuous processing) vs. batch (cheaper, predictable resources). Exactly-once is complex; at-least-once is simpler. Strong consistency (slower) vs. eventual consistency (faster). Discuss Netflix's priorities: cost matters (billions in infrastructure), but personalization quality matters more (drives subscriptions). At mid-level, you should clearly articulate trade-offs rather than picking one extreme. Example: 'For user recommendations, we use eventual consistency (fast, cheap) accepting recommendations might be 1-2 hours stale. For billing, we use exactly-once semantics (slower, more complex) ensuring accuracy.'
Practice Interview
Study Questions
Processing Layer: Batch vs. Real-time & Technology Choices
Design processing: Batch (Spark, Hadoop) processes large volumes efficiently but has latency (hourly/daily delay). Real-time (Kafka Streams, Flink, Storm) processes events immediately but requires sophisticated handling. Netflix uses both: real-time for fresh recommendations, batch for analytics and model training. Discuss: What gets processed real-time? (user events for immediate personalization) vs. batch? (analytics, dashboards). Technology choice: Spark for complex transformations at scale, Kafka Streams for simpler real-time, Flink for complex real-time logic. At mid-level, explain why: 'Spark handles complex joins and ML preprocessing batch; real-time personalization uses Kafka Streams for simplicity and operational control.'
Practice Interview
Study Questions
Scalability, Bottlenecks & Load Distribution
Design for 5B+ events/day, potentially 10x that in future. Identify bottlenecks: Is it ingestion (Kafka brokers maxed), processing (Spark job too slow), or storage (disk full)? Partition data strategically: viewing events by (date, region) enables parallel processing. Kafka partitions should handle peak load. At mid-level, discuss: 'If each of 200M users generates 25 events/day, that's 5B events. Kafka with 100 partitions handles 50M events/partition/day—manageable. But if peak is 10x average, we might need to spike up resources.' Scale horizontally (add more machines) vs. vertically (bigger machines). Horizontal is more resilient.
Practice Interview
Study Questions
Netflix-Scale Data Architecture & Requirements Gathering
Design systems for Netflix's scale: 200+ million users, 5000+ titles, petabytes of viewing data daily, global presence. Start by clarifying requirements: What data? Viewing events from 200M devices? What volume? Assume 5B events/day globally. Latency needs? Real-time (for recommendations) vs. batch (nightly reports)? Consistency? Eventually consistent is fine for recommendations; views must be accurately counted. Ask about access patterns: is data read 100x more than written? Design accordingly. At mid-level, you should proactively ask these questions rather than making assumptions.
Practice Interview
Study Questions
Data Ingestion & Real-time vs. Batch Processing
Discuss ingestion strategies: Real-time streaming (Kafka topics, events pushed immediately) captures every event but requires continuous processing. Batch (daily dumps from OLTP databases) is simpler but stale. Often you use both: stream events for real-time recommendations, batch consolidate for analytics. Netflix probably streams viewing events for fresh recommendations but batches billing data. At mid-level, explain trade-offs: 'Real-time ingestion handles immediate personalization but requires complex pipeline monitoring. Batch is simpler but our recommendations are stale if data is 1 day old.' Design for Netflix's needs: real-time personalization (stream) + next-day analytics (batch).
Practice Interview
Study Questions
Data Storage: Data Lake, Warehouse & Serving Layer
Design storage architecture: Raw layer (data lake) stores unprocessed events—high volume, long-term retention. Processed layer stores cleaned, transformed data—organized by business logic. Serving layer (data warehouse or real-time cache) serves specific use cases (dashboards, ML models, recommendations). Netflix probably: S3 data lake for raw viewing events, processed tables in data warehouse, cached recommendations in-memory store. At mid-level, discuss: Where does each type of data go? How long is retained? How is it accessed? Discuss technologies: S3/HDFS for data lake (unlimited scale, append-only), Redshift/BigQuery for warehouse (optimized for analytics queries), Redis/Memcached for real-time cache (low latency).
Practice Interview
Study Questions
Onsite Round 5: Behavioral, Teamwork & Culture Fit
What to Expect
Final onsite round (45-60 minutes) focused on behavioral assessment and Netflix cultural alignment. You'll discuss past projects, how you handled challenges, examples of collaboration and learning, and questions exploring Netflix's 'Freedom & Responsibility' culture. Expect questions like 'Tell me about a time you disagreed with a teammate's approach' or 'Describe a project that failed and what you learned'. This round assesses whether you thrive in Netflix's autonomous environment, collaborate effectively across teams, learn continuously, and align with company values.
Tips & Advice
Use STAR method: Situation, Task, Action, Result. Structure answers with concrete examples from your work. Prepare 5-7 stories: technical challenge you overcame, time you collaborated successfully, conflict with teammate and resolution, failure and lessons learned, time you mentored someone, example of taking ownership, and how you stay current technically. Be specific: 'We reduced ETL latency from 6 hours to 1 hour, enabling real-time dashboards' beats 'I improved performance.' Netflix values autonomy and independent thinking—share examples where you made decisions without explicit permission or guidance. Show learning mindset: 'I didn't know Spark initially, so I took a course and built a prototype' demonstrates growth. Be genuine; interviewers detect rehearsed answers. They want to understand how you think and work with others. For mid-level, emphasize owning projects end-to-end and enabling others (mentoring junior engineers, helping teammates unblock).
Focus Topics
Staying Current & Learning New Technologies
Data engineering evolves rapidly. Describe how you stay current: Do you read blogs, take courses, build side projects? Example: 'I follow the data engineering subreddit, took a course on data quality frameworks, and built a prototype using DuckDB to understand columnar databases better.' Shows continuous learning. At mid-level, you should be intentionally developing skills. Netflix evolves its tech stack; they want engineers who learn.
Practice Interview
Study Questions
Learning from Failures & Growth Mindset
Describe a project that failed or had significant issues. What went wrong? What did you learn? How did you apply that learning? Avoid blame; own your part. Example: 'Our ETL crashed in production because we didn't test the error path. I was devastated, but learned the importance of chaos engineering. I now design recovery mechanisms upfront.' Shows humility and learning. At mid-level, you're expected to have faced non-trivial challenges and grown from them. Netflix values learning over perfection.
Practice Interview
Study Questions
Conflict Resolution & Disagreements
Describe a time you disagreed with a teammate or manager on technical approach. How did you handle it? Did you advocate for your position while remaining respectful? Ultimately, whose approach did you use and why? Example: 'My manager wanted to use Lambda functions for ETL; I believed Spark was better for data volume. I prepared a comparison, showed benchmarks, and explained maintenance implications. We both agreed Spark was right, and he appreciated the analysis.' Shows mature conflict resolution—neither stubborn nor doormat.
Practice Interview
Study Questions
Mentoring, Enabling Others & Supporting Team Growth
At mid-level, you're expected to help junior engineers grow. Describe a time you mentored someone or helped a teammate unblock. What approach did you take? Did you give them the answer or help them figure it out? Example: 'A junior engineer struggled with Spark optimization. Rather than optimize their code, I walked them through profiling tools and asked guiding questions. They learned and optimized better than I would have.' Shows good mentoring. At mid-level, you're transitioning from pure execution to enabling others.
Practice Interview
Study Questions
Handling Ambiguity, Making Decisions & Taking Initiative
Describe a situation with ambiguous requirements where you had to make a decision without explicit guidance. How did you approach it? Did you ask clarifying questions? Make reasonable assumptions? At Netflix, you're expected to move forward independently rather than wait for permission. Example: 'The requirement was vague—'improve data quality.' I analyzed error logs, identified the 3 most impactful issues, proposed specific improvements with effort estimates, and started on the highest-impact one.' Shows good judgment. At mid-level, you should demonstrate ability to break down ambiguous problems and move forward.
Practice Interview
Study Questions
Collaboration Across Teams & Stakeholder Management
Share examples of working effectively with data scientists, product managers, analysts, or other engineers. How did you understand their needs? How did you explain technical constraints? Describe a time you had to balance data engineer priorities (clean architecture, optimization) with stakeholder needs (fast delivery). Example: 'Data scientists needed a real-time feature; I explained that would require streaming infrastructure (3-month build). We compromised: provide batch updates daily (2 weeks). They understood the trade-off.' At mid-level, you're expected to communicate with diverse audiences and find solutions that work for everyone.
Practice Interview
Study Questions
Technical Project Ownership & End-to-End Delivery
Prepare 2-3 detailed examples of projects you owned from conception to production. For each: What was the business problem? What technical challenges existed? How did you approach the solution? What obstacles did you face? How did you overcome them? What was the impact? At mid-level, ownership means you made design decisions, owned quality, collaborated with stakeholders, and drove to completion. Not just 'I wrote code someone else designed.' Example: 'Our data quality checks were manual; I designed and implemented an automated system that caught errors within 5 minutes of ingestion, reducing downstream rework by 60%.' Be specific about your contribution vs. team effort.
Practice Interview
Study Questions
Frequently Asked Data Engineer Interview Questions
Design a scalable deduplication algorithm in PySpark for a multi-terabyte events dataset where duplicates can be late-arriving. Provide pseudocode and discuss trade-offs for shuffle volume, memory, and correctness under failures.
Sample Answer
Direct answer
Deduplicate on the natural event key (not on the full row) using a deterministic ranking window function, row_number() over partitionBy(event_key).orderBy(ingest_time, tie_breaker), keeping rank 1, rather than dropDuplicates(), because dropDuplicates gives no control over WHICH copy of a duplicate is kept when duplicates disagree in any other column, and late-arriving duplicates specifically need a clear, explicit "first write wins" (or "last write wins", depending on the business rule) policy rather than whatever Spark's internal execution happens to keep.
Structured elaboration
Why not just dropDuplicates(["event_id"])? It works for correctness (exactly one row per event_id survives) but which of several duplicate rows survives is unspecified when they differ in other columns (for example, differing ingest_time due to late arrival, or a corrected payload in a later duplicate); relying on unspecified behavior for a business-meaningful choice (keep the FIRST-seen copy, or keep the copy with the LATEST correction) is fragile and the correct policy varies by domain, so it should be explicit in the query, not implicit in the engine's execution order.
Design for late-arriving duplicates specifically. "Late-arriving" means the SAME logical event can appear again in a LATER micro-batch or a later partition of a batch job, potentially long after the original. A pure in-memory Set-based dedup (as would work for a single bounded batch entirely in memory) does not scale to multi-terabyte data and does not naturally handle duplicates arriving in separate batches days apart; a window-function approach that reads the FULL relevant history (or, for a streaming job, uses dropDuplicatesWithinWatermark bounded by a watermark) is what actually scales.
Shuffle volume. The dedup key's partitioning determines shuffle cost directly: partitionBy(event_id) shuffles the full dataset once (unavoidable, since duplicates of the same key must land in the same partition to be compared), proportional to total data volume, not to the number of DISTINCT keys. For a truly multi-terabyte dataset, this shuffle is the dominant cost of the whole job; there is no way to avoid it while guaranteeing correctness for arbitrarily-late duplicates, since any two duplicate rows could in principle be in different physical files that both need to be compared.
Memory. The window function's per-partition working set is bounded by the number of duplicate ROWS per key (usually small, a handful of copies at most), not by total partition size, so memory pressure here is driven mainly by partition-count/skew choices (the standard shuffle-sizing considerations), not by anything dedup-specific, UNLESS a small number of keys have pathologically many duplicate copies (a genuine data-quality bug upstream, worth alerting on separately).
Correctness under failures. If the dedup job itself fails partway and is retried, re-running the identical deterministic window-function query over the same (or a superset, if incrementally reprocessing) input produces the identical result, since row_number() with a fully deterministic order (including the tie-breaker) is a pure function of its input; this is a meaningfully stronger property than, for example, a stateful streaming dedup relying on an accumulating in-memory or state-store set that must itself be checkpointed correctly to survive a restart without either losing dedup state (letting a duplicate back in) or growing unboundedly.
Worked example
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window
spark = SparkSession.builder.master("local[2]").appName("dedup").getOrCreate()
data = [
("e1", "u1", "2026-01-01 09:00:00", "2026-01-01 09:00:05"),
("e1", "u1", "2026-01-01 09:00:00", "2026-01-01 09:00:07"), # duplicate of e1
("e2", "u1", "2026-01-01 09:01:00", "2026-01-01 09:01:02"),
("e3", "u2", "2026-01-01 08:50:00", "2026-01-01 09:05:00"), # late-arriving original
("e2", "u1", "2026-01-01 09:01:00", "2026-01-01 09:06:00"), # very late duplicate of e2
]
df = spark.createDataFrame(data, ["event_id", "user_id", "event_time", "ingest_time"]) \
.withColumn("event_time", F.to_timestamp("event_time")) \
.withColumn("ingest_time", F.to_timestamp("ingest_time"))
# First-ingest-wins policy, deterministic tie-break on user_id in case two
# copies share an identical ingest_time.
w = Window.partitionBy("event_id").orderBy("ingest_time", "user_id")
deduped = (df.withColumn("rn", F.row_number().over(w))
.filter(F.col("rn") == 1)
.drop("rn")
.orderBy("event_id"))
deduped.select("event_id", "user_id", "event_time", "ingest_time").show(truncate=False)
print("distinct event_ids:", deduped.select("event_id").distinct().count())
print("row count after dedup:", deduped.count())
Output (actually executed with python3.12 + pyspark 3.5.1, Java 17, local[2]):
+--------+-------+-------------------+-------------------+
|event_id|user_id|event_time |ingest_time |
+--------+-------+-------------------+-------------------+
|e1 |u1 |2026-01-01 09:00:00|2026-01-01 09:00:05|
|e2 |u1 |2026-01-01 09:01:00|2026-01-01 09:01:02|
|e3 |u2 |2026-01-01 08:50:00|2026-01-01 09:05:00|
+--------+-------+-------------------+-------------------+
distinct event_ids: 3
row count after dedup: 3
The duplicate e1 copy (ingested at 09:00:07) and the very-late duplicate e2 copy (ingested at 09:06:00, four minutes after the original) are both correctly dropped, keeping the FIRST-ingested copy of each; the late-arriving genuinely-new event e3 (whose event_time is earlier than everything else, but which only arrived at ingest_time 09:05:00) is correctly kept as its own row since it is not a duplicate of anything, demonstrating that "late-arriving" and "duplicate" are independent properties this design handles separately and correctly.
Trade-offs and pitfalls
- Shuffle volume is proportional to total data scanned, not to how sparse the duplicates are. Even a dataset with a 0.01% duplicate rate pays the full shuffle cost of partitioning by
event_id, because the dedup logic cannot know in advance which rows are duplicates without comparing them; this is the fundamental cost floor of exact, correctness-guaranteed dedup at scale, and it is not avoidable by a cleverer algorithm, only bounded by scoping the comparison window (see below). - Bounding the comparison scope for genuinely unbounded lateness. For streaming or very-large incremental batch jobs, comparing every new row against the ENTIRE historical dataset is not sustainable;
dropDuplicatesWithinWatermark(Structured Streaming) or an explicit business-defined lateness bound (e.g., "duplicates can arrive up to 7 days late, beyond that treat as a new event") trades perfect correctness for arbitrarily-late duplicates against bounded state size, which is usually the right trade-off in practice since unbounded state growth is itself a production risk (that trade-off in more depth). - Correctness under failures depends on the dedup key and tie-breaker being FULLY deterministic. If the tie-breaker itself is non-deterministic (for example, relying on row physical order rather than an explicit column), a retry after a partial failure can pick a DIFFERENT duplicate copy to keep than the original attempt did, which is a subtle correctness bug that only manifests on retries, not on a clean single run, making it easy to miss in testing.
- Common mistake: deduplicating on a composite of MANY columns ("the whole row minus timestamp") instead of a true business key, which silently fails to catch duplicates that differ in any column at all (for example, a duplicate event re-sent with a corrected but different payload value is not a "duplicate" by a whole-row comparison, even though it represents the same underlying event and should be resolved by the same explicit keep-policy, not accidentally kept as two separate rows).
You are asked to design an organization-wide data-quality program covering people, process, and technology: roles (such as data stewards), policies and standards, tooling choices (a framework like Great Expectations or dbt tests), training, and success KPIs. Propose a phased rollout (pilot, scale, sustain) with measurable milestones for a six-month horizon, and explain how you would drive adoption across teams that do not report to you.
Sample Answer
Direct answer
An organization-wide data-quality program needs to cover people (roles like data stewards with clear accountability), process (policies, standards, and an incident-response playbook), and technology (a chosen tooling stack), rolled out in phases (pilot, scale, sustain) with measurable milestones, since attempting a company-wide rollout all at once, without a proven pilot, is the most common way this kind of initiative fails.
Structured elaboration
- Pilot phase (roughly months 1-2): select one or two high-visibility, high-pain pipelines as the pilot, implement the full program (stewardship, standards, tooling) end-to-end for just those, and use the pilot to prove the model works and generate a concrete before/after story to build momentum with.
- Scale phase (roughly months 3-4): expand from the pilot to the next tier of critical pipelines, using lessons learned (what tooling choices worked, what process friction showed up) to refine the approach before it becomes standard practice everywhere.
- Sustain phase (roughly months 5-6 and beyond): make the standards and tooling the default for new pipelines going forward, establish ongoing training and onboarding for new team members, and define success KPIs that are tracked continuously rather than only during the initial rollout.
- Tooling choices: the technology leg is not just "pick a tool," it is picking the tool whose friction matches how the organization already works. For a team already heavily invested in dbt-based SQL transformations, dbt tests (the built-in and dbt-native
unique,not_null,accepted_values,relationshipstests, plus custom SQL-based tests) are the lower-friction choice: they live alongside the existing models, run in the samedbt testinvocation the team already uses, and require no new language or deployment surface. For an organization needing richer, cross-language validation (Python-based pipelines, non-dbt sources, or a need for a structured, queryable validation report rather than a pass/fail test run), Great Expectations is the better fit: it is a standalone Python framework that produces a structured "data docs" report and integrates with a wider range of data sources than a SQL-only tool can. The right call is decided by which cost the team can least afford, the friction of adopting a new tool outside their existing stack, or the limitation of a SQL-only tool when the pipeline is not SQL-only, not by which tool is abstractly "better." - Driving adoption across teams that do not report to you: this is fundamentally an influence problem, not an authority one; the pilot's concrete, quantified success story (a real incident prevented, a real cost saved) is usually the most effective adoption lever, more so than a mandate from above, because it gives other team leads a self-interested reason to opt in rather than a compliance obligation to resent.
Worked example
A six-month program: months 1-2 pilot the full program on the two pipelines that generated the most incidents last quarter, producing a concrete result (for example, a measured 80% reduction in data-quality-related incident tickets for those two pipelines); months 3-4 use that result to recruit three more team leads to adopt the same standards and tooling voluntarily, refining the onboarding process based on friction the pilot teams reported; months 5-6 make the validated tooling the default for any new pipeline going forward and establish a recurring quarterly review of the program's KPIs (incident rate, time-to-detection, percentage of critical datasets with defined quality checks) to the leadership team.
Trade-offs and pitfalls
The failure mode this phased approach specifically avoids is a mandated, all-at-once rollout with no proven pilot: teams asked to adopt an unproven process purely by directive tend to comply minimally and revert as soon as attention moves elsewhere, whereas teams who see a peer team's concrete, quantified success story are far more likely to adopt genuinely and sustain it. The trade-off is speed, a pilot-first approach is slower to reach full coverage than a mandate, but it is far more likely to actually stick once it gets there.
Given a login-attempts table, write a query that flags users with 3 or more consecutive failed login attempts within any rolling 10-minute window, returning the user and the start time of the offending sequence. Explain how you avoid both false positives (isolated failures spread far apart) and firing duplicate alerts for the same overlapping sequence.
Sample Answer
Direct answer: Filter to failed attempts, group consecutive failures for each user into a run using a running count of successes (each success starts a new run of failures), number the failures within each run, and then check whether the timestamp 3 positions apart in the same run is within 10 minutes of the first. This avoids both false positives (isolated failures with successes or long gaps between them break the run before they can combine into 3) and duplicate alerts, because it flags a single deterministic window_start per qualifying triple rather than every possible sliding window over the same failures.
Structured elaboration
- Group consecutive failures. A running
SUMof asuccessindicator (1 for success, 0 for failure), ordered by time, increments only when a login succeeds. Between two successes, that running total is constant, so it acts as a group id: every failure that happens between the same pair of successes (or before the first success) shares one group id. This is the identical gaps-and-islands mechanism used to find consecutive-day streaks elsewhere in this topic, applied here to failure runs instead of calendar days. - Number failures within each run.
ROW_NUMBER()partitioned by (user, group id) gives each failure its position in its run: 1st, 2nd, 3rd failure since the last success. - Check the 10-minute window on a triple. Self-join the numbered failures to themselves, matching row N to row N+2 in the same run, and keep pairs where the timestamp gap is at most 10 minutes. The earlier row's timestamp is the offending sequence's
window_start.
WITH ordered AS (
SELECT user_id, attempted_at, success,
SUM(CASE WHEN success THEN 1 ELSE 0 END) OVER (
PARTITION BY user_id ORDER BY attempted_at ROWS UNBOUNDED PRECEDING
) AS success_grp
FROM logins
),
fails AS (
SELECT user_id, attempted_at, success_grp,
ROW_NUMBER() OVER (PARTITION BY user_id, success_grp ORDER BY attempted_at) AS fail_idx
FROM ordered
WHERE success = FALSE
)
SELECT DISTINCT n1.user_id, n1.attempted_at AS window_start
FROM fails n1
JOIN fails n3
ON n1.user_id = n3.user_id
AND n1.success_grp = n3.success_grp
AND n3.fail_idx = n1.fail_idx + 2
AND n3.attempted_at - n1.attempted_at <= INTERVAL '10 minutes'
ORDER BY user_id, window_start;
Worked example (executed in DuckDB). User 1: 3 failures at 09:00, 09:02, 09:04 (all within 4 minutes, then a success), plus an isolated failure at 09:30. User 2: 3 failures at 10:00, 10:20, 10:40 (20 minutes apart each, no success in between, so all one run, but spanning too much time).
flagged_user_id | window_start
1 | 09:00:00
Only user 1 is flagged. User 2's three failures are genuinely consecutive (same run, no intervening success) but span 40 minutes end to end, so the 3rd-failure-minus-1st-failure gap (40 minutes) exceeds 10 minutes and correctly does not trigger.
How this avoids false positives. An isolated failure surrounded by successes, or spread far from other failures in time, never gets two more failures within the same success_grp inside a 10-minute span, so it never satisfies the fail_idx = fail_idx + 2 self-join condition. The grouping by success_grp is what prevents counting a failure from a completely different, much earlier attack attempt toward the current count: any success in between resets the run.
How this avoids duplicate alerts for overlapping sequences. A naive rolling-window formulation (check every failure against every failure exactly 10 minutes later) would fire once per qualifying failure inside a longer run of 4+ failures, producing overlapping, redundant alerts for what is really one incident. This query instead reports exactly one window_start per distinct triple (fail_idx, fail_idx+2): a run of exactly 3 failures produces exactly one alert; a run of 5 rapid failures produces up to 3 overlapping-but-distinct triples (1-3, 2-4, 3-5), which is a deliberate design choice (each triple is separately true), not a bug, but if the requirement is 'one alert per incident, not one per triple,' take MIN(window_start) per (user_id, success_grp) after this query to collapse a whole run down to a single alert.
Trade-offs & pitfalls
- This detects 3+ consecutive failures within a 10-minute span of THAT triple; it does not detect, say, 2 failures 8 minutes apart followed by a 3rd failure 15 minutes after the first two but still within 10 minutes of the 2nd. If the intended semantics is 'any 3 failures within a rolling 10-minute window regardless of adjacency,' that's a genuinely different, more expensive query (a self-join or a true sliding window count, not a fixed offset of 2).
- Collapsing a long run of failures down to one alert (via
MIN(window_start) GROUP BY user_id, success_grp) is a deliberate design decision, not automatic; decide upfront whether security wants one alert per run or one per qualifying triple. - The self-join is the expensive part at scale: it's proportional to the number of failure pairs 2 apart within a run, which is cheap for normal traffic but can grow for a user under sustained attack with thousands of failures in one run; a streaming engine with a native session/window operator is usually a better fit for production-scale abuse detection than a batch self-join.
After a working meeting, write a concise summary (3-6 sentences) that captures the decision made, who owns each follow-up, the deadlines, and any question that is still open.
Sample Answer
Direct answer
Write a short summary right after the meeting that states the decision made, names an owner and deadline for each follow-up, and flags anything still unresolved, so nobody has to reconstruct what happened from memory a week later.
Structured elaboration
- State the decision first, in one sentence, even if it feels obvious right after the meeting; it stops being obvious within a day or two, especially for people who weren't in the room.
- List action items with an owner and a deadline each, not a bare to-do list; "someone should look into X" is not actionable, "Priya will check the vendor SLA by Thursday" is.
- Name what's still open, explicitly, rather than letting it quietly drop; a one-line "not yet decided: whether we notify customers proactively" prevents someone assuming it was implicitly settled.
- Send it promptly, ideally within the hour, while the details are fresh and before people have moved on to something else and stopped tracking it mentally.
- Keep it short. Three to six sentences is usually enough; a summary that's as long as a transcript won't get read.
Worked example
"Decision: we're moving the schema migration to next Tuesday's low-traffic window instead of doing it live this week. Action items: Priya to update the migration runbook by Monday EOD; Sam to notify the on-call rotation of the new window by Friday. Open question: whether we need a customer-facing heads-up, still deciding, will confirm by Wednesday."
Three sentences, one decision, two owned action items with deadlines, and one explicitly flagged open item.
Trade-offs and pitfalls
- The most common failure is writing a summary that lists what was discussed instead of what was decided; a meeting can generate a page of discussion and one real decision, and the summary should reflect that ratio.
- An action item without a named owner tends to silently not get done; if you can't name an owner in the summary, that's a sign the meeting didn't actually resolve who's responsible.
- Sending it too late (days later) defeats the purpose; by then people have already formed their own, sometimes conflicting, memory of what was agreed.
A global business stores event timestamps in UTC, but stakeholders want dashboards reported in local business time (per country or per user). Describe how you would model the date/time dimension and the facts to support local-time reporting and time-zone-aware aggregation, while avoiding double-counting or dropping events across daylight-saving transitions and date boundaries.
Sample Answer
Direct answer
Store the raw event timestamp in UTC on the fact table (never convert at write time), and store the local business date/time as a SEPARATE derived attribute computed using the relevant time zone at query or extract, transform, load (ETL) time, keyed off the dimension that determines which time zone applies (the user's or store's location). Never overwrite or discard the original UTC timestamp.
Structured elaboration
- Why keep UTC as the source of truth: local time is a function of UTC time plus a time zone, and time zones (and their daylight-saving offsets) change; if you only store a converted local time and discard the UTC original, you lose the ability to correctly re-derive local time later if the zone or DST rules change, and you can't reliably compare events across different local time zones at all.
- Deriving local business time: join the fact (with its UTC timestamp) to a time-zone lookup (either on the relevant dimension, like
store_dim.timezone, or a separatecountry_timezonetable) and compute local time at query or ETL time:event_time_utc AT TIME ZONE store_dim.timezone. This correctly accounts for daylight-saving transitions if the underlying time zone conversion function is DST-aware (most modern SQL engines and time zone libraries are). - Avoiding double-counting across date boundaries: aggregating "daily" metrics must group by LOCAL date (derived from local time), not the UTC date, or a single business day's activity gets split across two UTC dates near midnight local time, undercounting or overcounting depending on the time zone offset direction. Precompute a
local_date_keyattribute per event during ETL if this grouping happens frequently, to avoid repeating the conversion in every query. - Materializing versus computing on demand: for high query volume against this pattern, materialize the local date/time as its own column at load time (computed once) rather than repeating the timezone conversion in every downstream query, which is both a performance optimization and a consistency guarantee (every query using the same precomputed local date, rather than each one potentially implementing the conversion slightly differently).
Worked example
An event occurs at 2026-03-08 06:30:00 UTC. For a user in New York (UTC-5 in early March, before the typical spring-forward DST transition), the local time is 2026-03-08 01:30:00, still March 8th locally. For a user in Tokyo (UTC+9), the same UTC timestamp is 2026-03-08 15:30:00, also March 8th locally, but a different clock time. If instead the event happened at 2026-03-08 03:00:00 UTC, the New York local time (UTC-5) is 2026-03-07 22:00:00, a DIFFERENT calendar date locally than the UTC date, exactly the kind of boundary case that breaks naive UTC-date-based daily aggregation for that user.
Trade-offs and pitfalls
The classic bug is grouping "daily active users" or similar metrics by the UTC date column directly, which systematically misattributes events near midnight to the wrong LOCAL day for every time zone except UTC itself, and does so silently (the query runs fine, the numbers just don't match what a local observer would report). Precomputing and testing the local-date derivation against known DST transition dates for major time zones is worth the ETL investment for any dashboard reporting daily metrics to a geographically distributed audience.
Explain why the optimizer's default per-column statistics can produce badly skewed cardinality estimates when two predicates on separate columns are actually correlated. What are extended (multi-column) statistics, and how would you decide whether creating them actually fixed a bad plan?
Sample Answer
Direct answer. Default per-column statistics assume each column's values are distributed independently of every other column, so when two columns are actually correlated, the optimizer multiplies their individual selectivities together and ends up with an estimate far lower (often wildly so) than the true combined selectivity; extended statistics explicitly capture how those columns co-vary, letting the optimizer estimate the combined predicate's selectivity directly rather than assuming independence.
Structured elaboration. If a city column and a state column are each individually somewhat selective on their own, but every value of city in the data only ever co-occurs with one specific state (a real-world correlation: cities belong to exactly one state), the independence assumption badly overestimates how selective city = X AND state = Y really is: multiplying each column's standalone selectivity together implies the combined predicate is far MORE selective than it actually is, since knowing the city already tells you the state with certainty. Extended (multi-column) statistics record the actual joint distribution across a specified set of correlated columns, so the optimizer can look up (or closely approximate) the real combined selectivity instead of computing a product that assumes independence.
Worked example. Two predicates might each independently match 10% of rows on their own; if they were truly independent, the combined predicate would match roughly 1% (10% times 10%). If the columns are perfectly correlated (every row matching one predicate also matches the other), the true combined match rate is still 10%, not 1%, a ten-fold estimation error that can easily push the optimizer toward an index-heavy plan appropriate for a genuinely rare combination, when the real combination is common enough that a scan-based plan would have been the better choice.
Trade-offs and pitfalls. Extended statistics have to be explicitly created and targeted at the specific column combination that's actually correlated, most engines don't infer correlation automatically and build multi-column statistics for every possible column pair on their own, since that would be prohibitively expensive to maintain; you generally need to notice the estimation error first (via an estimate-actual mismatch on a predicate involving those columns) before you know which specific column combination is worth the investment. Once created, verify the fix by re-checking that predicate's estimated-vs-actual row count, rather than assuming creating the statistics automatically resolved the issue, since the statistics also need to be genuinely representative of the current data to help.
How do you communicate the 'why' behind technical work to product managers and to engineers? Provide concrete examples of artifacts or conversations (for example: PRD sections, one-pager, kickoff slides, acceptance criteria) you would use; show how you translate a business goal into technical acceptance criteria and measurable success metrics so engineers understand purpose and PMs understand constraints.
Sample Answer
Situation: At my last company we needed to reduce time-to-insight for business analysts on user behavior – PM goal was “enable analysts to run product funnels within 2 hours of event occurrence” to improve experimentation speed.
Task: As the data engineer owner, I needed to explain why this mattered to PMs (business impact) and to engineers (technical scope) and produce artifacts that aligned both groups.
Action:
- One-pager for PMs: problem statement, business goal, target metric (median freshness ≤ 2 hours), constraints (cost budget, retention policy), and trade-offs (near-real-time vs. backfill complexity). This used simple graphs showing current latency distribution and business impact (e.g., delayed experiments).
- Kickoff slides for engineers: architecture sketch (stream ingestion → processing → warehouse), throughput/latency requirements, expected SLA, error budget, and required changes (add Kafka topic, Spark Structured Streaming job, incremental CDC).
- PRD section “Acceptance Criteria” (clear, testable):
- Event pipeline processes ≥ 99% of events within 2 hours end-to-end.
- Mean event lag ≤ 30 minutes; 95th percentile ≤ 2 hours.
- Data schema versioning in place; no breaking changes without migration.
- Monitoring: alerts on lag > 2 hours for >5 minutes and daily data quality report.
- Implementation tasks mapped to sprint tickets with definitions of done (unit tests, integration test against sample traffic, runbook).
Result: PMs accepted the trade-offs; engineers had unambiguous targets and built the streaming pipeline. Within 6 weeks median freshness dropped to 15 minutes and 95th percentile to 1.3 hours; experiment iteration time halved.
What I learned: Always state the business outcome first, then translate it into measurable SLAs and concrete acceptance criteria. Use different artifacts (one-pager for PMs, technical kickoff and PRD acceptance criteria for engineers) so each audience gets the "why" framed in terms they act on.
Why keep a raw staging or landing layer separate from the curated tables analysts query, instead of transforming straight into the final tables? What actually happens in that staging layer, and what retention policy would you set for it?
Sample Answer
A staging (or landing) area is a raw, largely untransformed copy of source data that sits between extraction and the curated tables analysts actually query. You keep it separate for three reasons that all come back to the same idea: the raw copy is your safety net.
What lives there and what happens to it
- Data lands close to its source shape (same columns, minimal type coercion) so a transformation bug never destroys information you didn't capture anywhere else.
- Light operations happen here before anything moves further downstream: basic type casting, deduplication of exact source-level duplicates, and enrichment that has to happen once (attaching a load timestamp, a source system tag, a batch id).
- It is the recovery point. If a downstream transform is wrong, you re-derive the curated table from staging instead of re-extracting from the source system, which may be slow, rate-limited, or (for a point-in-time correction) no longer possible to reproduce exactly.
Retention
Staging data is usually cheap: raw storage, no indexes, no BI-facing service-level agreements (SLAs) to honor, so a common policy is to keep it far longer than the curated layer needs, often 30 to 90 days on a rolling window, sometimes indefinitely for regulated or audit-sensitive domains. The retention call is really a bet: how far back would you ever need to reprocess from raw, versus what the storage costs to keep that option open.
Trade-offs and pitfalls
Skipping staging (transforming directly from source into curated tables) is tempting because it looks like fewer moving parts, but it collapses your only recovery path into "re-run the extraction," which does not always give you the same data twice (source systems get pruned, APIs paginate differently over time, upstream tables get purged). The opposite failure is treating staging as query-able and letting analysts hit it directly: it has none of the cleaning, deduplication, or documentation the curated layer promises, so ad-hoc use of staging tends to produce numbers that quietly disagree with the official dashboard.
A 20-person startup currently produces its reports by running ad-hoc SQL directly against its production PostgreSQL database and copying numbers into spreadsheets. What specific signals would tell you it is time to invest in a dedicated data warehouse rather than continue this way, and what is the simplest version of a warehouse you would recommend building first, rather than starting with a full Kimball-style enterprise build?
Sample Answer
Direct answer
Move to a dedicated warehouse when ad-hoc analytical queries start measurably hurting the production database's transactional performance, when the same numbers are being computed slightly differently in different spreadsheets, or when reporting needs data joined across sources the production database does not have (a payments processor, a support tool, a marketing platform). Start with the simplest useful version: a small set of tables that are periodically copied out of production into a separate database or a managed cloud warehouse, denormalized just enough to answer the handful of reports people actually run today, not a fully modeled Kimball bus architecture with conformed dimensions across every future business process.
Structured elaboration
Signal one: production impact. A heavy analytical query (a full table scan for a monthly report, say) run directly against the database serving live user traffic can degrade transactional latency for real users; if analysts are being asked to "only run reports at night" or engineers are seeing production incidents traced to a report someone ran, that is a concrete, observable signal, not a vague sense that things feel slow.
Signal two: inconsistent numbers. Once more than one person is computing the same metric independently (one analyst's spreadsheet formula, another's ad-hoc query), small differences in filtering or date handling silently produce different answers to "what was our revenue last month," and nobody notices until two answers are compared in the same meeting. This is the earliest, cheapest form of the exact conformance problem later covered by dimension conflicts across marts; catching it before it compounds is far cheaper than the reconciliation project.
Signal three: joining across sources. Once a report needs to combine production order data with a separate support tool's ticket data and a third-party payment processor's transaction data, there is no single production database to query against anymore; some place has to receive copies of all three and let them be joined together, which is the core job a warehouse exists to do.
The simplest version to build first. Do not start with a full dimensional model. Start with a small, straightforward extract-and-load process (even a scheduled job that copies a handful of production tables into a separate database or a managed cloud warehouse on a nightly cadence) and let analysts query those copies directly, denormalized or lightly modeled, for exactly the reports people already run. Introduce actual dimensional modeling (declared grain, a real date dimension, slowly-changing-dimension handling) only once a second or third report reveals that ungoverned ad-hoc structure is producing inconsistent answers or is too slow to maintain by hand, which is the point at which the methodology and system-design questions the rest of this topic covers actually become relevant.
Worked example
A single unindexed analytical query scanning a 10-million-row production orders table for a monthly report can hold a lock or consume enough I/O bandwidth to add hundreds of milliseconds to unrelated transactional queries hitting the same table concurrently; at a company processing customer-facing checkout requests against that same table, a delay large enough for customers to notice during checkout is the concrete, business-visible cost of skipping a warehouse, not an abstract inefficiency. That single observation, "a report degraded checkout latency," is usually the moment a 20-person startup's engineering leadership actually approves the investment, well before any of the modeling-methodology questions in this topic become the operative concern.
Trade-offs and pitfalls
The most common mistake at this stage is over-building: reaching for a full Kimball-style bus architecture, multiple conformed dimensions, and Type 2 slowly changing dimension (SCD) history tracking before there is more than one or two reports that need any of it wastes engineering effort the startup does not have to spare, and most of that early investment will be redesigned anyway once real reporting needs are better understood. The opposite mistake, waiting until the production database is visibly struggling before doing anything, is also common and more expensive to unwind, since by then inconsistent numbers have usually already reached several audiences and eroded trust in whichever spreadsheet or dashboard people were relying on.
Design a 30-60-90 day onboarding plan for a new hire joining your team. What do you prioritize in each phase, and how do you know they're on track?
Sample Answer
Direct answer
A good 30-60-90 plan moves someone from learning the environment, to contributing under supervision, to owning outcomes independently, with the phase boundaries defined by demonstrated behavior (what they can do unsupervised) rather than by the calendar alone. Track it with a small number of concrete, visible outputs per phase so "on track" is something you can point to, not just a feeling.
The three phases, by what changes
- Days 1-30 (learn and observe): environment setup, codebase or domain orientation, shadowing, and one small real contribution rather than a toy task, so the first change is real but low-risk.
- Days 31-60 (contribute under guidance): own a medium-sized piece of work end to end with a mentor available for review and unblocking, not doing it alongside them line by line.
- Days 61-90 (own outcomes): lead something (a project, an on-call rotation, a smaller onboarding task for the next hire) with the mentor as a backstop, not a co-pilot.
How you know they're on track
- Define the signal per phase in advance, not retroactively: for phase 1, did they reproduce the environment and ship one small real change without major help; for phase 2, is their review feedback shrinking in volume and severity over successive changes; for phase 3, can they make a reasonable decision alone and only escalate the genuinely hard calls.
- Check in on cadence (weekly early on, less frequent later) rather than waiting for day 30, 60, or 90 to find out something drifted three weeks ago.
Adjusting the plan for real constraints
- Limited training resources: when there's no dedicated ramp-up bandwidth (no spare mentor hours, no formal training material), lean harder on asynchronous artifacts: written runbooks, recorded walkthroughs, a curated list of the most representative recent changes, and a lighter-touch weekly sync instead of daily pairing. The phases stay the same; what changes is how much is self-serve versus live.
- Cross-skill ramp: if someone hired primarily for one skill set is expected to also ship in an adjacent one by day 90 (for example, a backend-focused hire expected to ship frontend work), that adjacent skill needs its own explicit milestone inside the plan, not an assumption it'll happen by osmosis. Concretely: days 1-30 stays focused on their strong area to build early confidence and trust; days 31-60 introduces the adjacent skill on a small, well-scoped, low-risk piece with close review; days 61-90 has them own something end to end in the new area, even if smaller in scope than their core-skill ownership.
Worked example
For a new hire joining an established codebase with a small team and no dedicated onboarding budget (the limited-resources case), the 30-60-90 looked like: days 1-30, self-serve environment setup using a written runbook plus a single half-day pairing session, culminating in one small, real bug fix; days 31-60, ownership of one medium feature with async review as the main touchpoint, and a short weekly 15-minute sync instead of daily check-ins; days 61-90, the new hire wrote the onboarding runbook update for the next person, which served double duty as both a real deliverable and a check on whether they actually understood the system well enough to explain it. Being on track was tracked by a short checklist per phase (environment reproducible, first fix merged with normal review effort, feature shipped with review comments trending down) rather than a single blanket "how's it going" check-in.
Trade-offs and pitfalls
- Treating the day boundaries as fixed calendar dates rather than behavioral milestones creates false confidence; someone can hit day 60 without actually being ready for phase-3 ownership, and pushing them into it anyway sets them up to fail.
- Under-supporting the adjacent-skill ramp (assuming a backend engineer will "pick up" frontend without an explicit milestone) is a common way cross-skill onboarding quietly fails; it needs the same structure as the primary skill, just smaller in scope.
- Compressing the plan under limited training resources by cutting phase 1 short (rushing into real ownership before the environment and codebase are understood) trades a faster-looking ramp for more review overhead and rework later.
Recommended Additional Resources
- DataCamp - 'Data Engineer Career Track' course
- Coursera - 'Data Engineering with Python' specialization
- Book: 'Fundamentals of Data Engineering' by Joe Reis & Matt Housley
- Book: 'Designing Data-Intensive Applications' by Martin Kleppmann
- Apache Spark Official Documentation (spark.apache.org)
- Apache Hadoop Definitive Guide (O'Reilly book)
- Leetcode SQL problems (65-85 difficulty level for practice)
- InterviewQuery - Netflix-specific interview questions
- DataLemur - SQL and Python data engineering challenges
- Netflix Tech Blog (medium.com/@NetflixTechBlog) for architecture insights
- Kaggle datasets for practice on large-scale data problems
- AWS, GCP, Azure free tiers for hands-on cloud experience
Search Results
Ace the Netflix Data Engineer interview: Essential 2025 guide
Interview Questions · Can you tell us about your experience with data warehousing and ETL processes? · How do you approach problem-solving in a data engineering ...
Netflix Data Engineer Interview in 2025 (Leaked Questions)
2.2 Phone Screen (30-45 Minutes) · Can you describe your experience with data engineering technologies? · What interests you about working at ...
Netflix Data Engineer Interview Guide (2025) – Process, Salary ...
Expect questions about your past data projects and familiarity with streaming or large-scale ETL—key for any data engineer Netflix candidate ...
Netflix Data Engineer Interview Guide | Sample Questions (2025)
Netflix Data Engineer Interview Guide · 1. Recruiter Screening · 2. Technical screening round · 3. Coding skills assessment · 4. System design round · 5.
10 Netflix SQL Interview Questions (Updated 2025) - DataLemur
This blog covers 10 Netflix SQL interview questions to practice, which are similar to recently asked questions at Netflix – able to answer them all?
PySpark Interview Question By Netflix | by B V Sarath Chandra
Identify users who watched at least 2 shows in the year 2025. For each user, calculate the number of days between their first and last watch ...
This interview preparation guide was generated using AI-powered research from the sources listed above. While we strive for accuracy, we recommend verifying critical information from official company sources.
Want to create your own tailored preparation guide using our deep research?
Get Started for FreeInterview-Ready Courses
Visual-first, interactive, structured learning paths