170 companion flashcards · AI-assisted study content · Open the deck →
This deck offers a broad introduction to the core concepts of data engineering, covering the foundational ideas you'll encounter in the field. You'll find questions about how data moves and is stored, from pipelines and orchestration tools like Apache Airflow, to storage architectures such as data warehouses, data lakes, and the schema designs that organize them. It also touches on key technologies like Apache Spark and Apache Kafka, as well as important distinctions like batch versus stream processing and ETL versus ELT.
It's a great fit if you're starting out as a data engineer, a data analyst looking to understand the systems behind your reports, or a software developer exploring a new specialization. The questions are also useful for anyone preparing for technical interviews, since many of the topics here come up frequently in screening conversations about data infrastructure and design choices.
To get the most out of these cards, try to connect each concept to a practical scenario as you review, for example imagining how a particular tool would fit into a real workflow. Because the topics build on one another, it's worth spacing your review sessions out over several days rather than cramming, so the definitions and comparisons have time to settle. Revisiting the more abstract ideas, like schema design or data quality, after a day or two often makes them stick much better than a single long session.
Data engineering rests on a small set of foundational patterns for moving and storing data. The two dominant integration approaches are ETL (Extract, Transform, Load) and ELT (Extract, Load, Transform). ETL transforms data in a staging area before loading it into a target warehouse, which suited earlier systems with limited compute. ELT reverses the order: raw data lands in the warehouse first and transformations run inside it, taking advantage of the elastic compute of modern cloud warehouses like Snowflake, BigQuery, and Redshift. A data pipeline is an automated series of steps that moves data from sources to a destination through ingestion, transformation, validation, and loading stages. Pipelines can run in batches on a schedule, in real time as events arrive, or in a hybrid of both, and are commonly orchestrated with tools like Apache Airflow or Prefect.
The choice of storage architecture underlies every pipeline. A data warehouse is a centralized, structured repository optimized for analytical querying and reporting, using a schema-on-write approach that enforces structure as data is loaded. A data lake stores vast amounts of raw data in its native format—structured, semi-structured, or unstructured—on systems like HDFS, Amazon S3, or Azure Data Lake Storage, applying structure only when data is read (schema-on-read). The lakehouse architecture combines the strengths of both by storing open-format data on cheap object storage while adding warehouse-like features such as ACID transactions, schema enforcement, and SQL analytics through technologies like Delta Lake, Apache Iceberg, and Apache Hudi. The distinction between OLTP (Online Transaction Processing) and OLAP (Online Analytical Processing) systems reflects this division: OLTP systems optimize for many short, write-heavy operations, while OLAP systems are tuned for complex read-heavy analytical queries over historical data.
The choice between batch and stream processing depends on latency and data characteristics. Batch processing handles data in large, discrete chunks at scheduled intervals, suited for historical analytics and reporting. Stream processing handles data continuously in near-real-time as it arrives, suited for real-time dashboards, fraud detection, and event-driven systems. Distributed data systems face trade-offs governed by the CAP theorem, which states that a system can guarantee at most two of consistency, availability, and partition tolerance. Since partitions are unavoidable in practice, real systems usually choose between strong consistency (every read sees the latest write) and eventual consistency (replicas converge over time), with NoSQL databases like DynamoDB and Cassandra favoring availability and partition tolerance. The main NoSQL types are key-value stores (Redis, DynamoDB) for simple lookups, document stores (MongoDB) for flexible JSON-like documents, column-family stores (Cassandra, HBase) for wide-column reads, and graph databases (Neo4j) for relationship-heavy traversals. ACID—Atomicity, Consistency, Isolation, and Durability—remains the cornerstone of transactional guarantees, and primary keys uniquely identify rows while foreign keys enforce referential integrity across tables.
Data modeling is the process of designing how data is structured in a database or warehouse to support efficient storage and querying. It involves defining entities, attributes, relationships, and constraints, and choosing between approaches like dimensional modeling (star and snowflake schemas) for analytics and entity-relationship modeling for transactional systems. Normalization organizes tables to reduce redundancy and improve integrity by splitting them into smaller, related tables following normal forms (1NF, 2NF, 3NF). Denormalization deliberately reintroduces redundancy to improve read performance, and is common in data warehouses and OLAP systems where fast query performance outweighs storage efficiency.
The most common analytics schema is the star schema, in which a central fact table containing measurable metrics is surrounded by dimension tables that hold descriptive attributes. Fact tables store quantitative, measurable business metrics—called measures—such as sales amount, quantity, or duration—along with foreign keys referencing dimensions. Dimension tables store descriptive attributes used to filter, group, and label facts, such as customer details or product categories. Because star schemas are denormalized, queries need few joins and run very fast. A snowflake schema normalizes dimension tables into multiple related tables—for example, splitting a product dimension into product, category, and brand—reducing redundancy at the cost of more joins. A fact constellation (or galaxy) schema extends the idea by sharing dimension tables across multiple fact tables, enabling cross-process analytics. A factless fact table is a fact table that contains no numeric measures, only foreign keys to dimensions; it records events or coverage such as "student attended class on date" and supports questions like "how many users logged in per day?" by counting rows.
Slowly Changing Dimensions (SCDs) describe how dimension records change over time. SCD Type 0 keeps the original value forever, such as a customer's signup date. Type 1 overwrites the old value, discarding history. Type 2 adds a new row with versioning to preserve full history and is the most widely used. Type 3 stores the previous value in a separate column for limited history. Type 4 uses a separate history mini-dimension for fast-changing attributes, while Type 6 is a hybrid combining Type 1, Type 2, and Type 3 to expose both current and historical values. Dimension tables typically use surrogate keys—system-generated artificial primary keys decoupled from source natural keys—to uniquely identify rows and remain stable even when source keys change. Specialized dimensional techniques include junk dimensions (combining many low-cardinality flags), degenerate dimensions (transaction IDs stored directly in the fact table), role-playing dimensions (the same dimension, such as date, used multiple times for different roles like order date and ship date), and conformed dimensions (with the same meaning and key across multiple data marts).
Fact tables come in several flavors. Transactional fact tables record individual events as they occur, with each row representing a single business event such as a sale or click; they grow append-only and support both current and historical analysis at fine granularity. Periodic snapshot fact tables record state at regular intervals, such as end-of-day account balances, useful for tracking slowly evolving states. Accumulating snapshot fact tables track the lifecycle of a process with multiple milestone dates—like order placed, paid, shipped, and delivered—and are updated as the process advances. The grain of a fact table is the level of detail each row represents and must be declared explicitly, because mixing grains is a serious modeling error. Measures are classified as additive (sumable across all dimensions, like revenue), semi-additive (sumable across some dimensions but not others, like account balance summed across accounts but not time), and non-additive (must be recomputed from base measures, like ratios and percentages). Two major methodological traditions guide warehouse design. The Kimball approach builds dimensional data marts directly from sources and integrates them via a bus matrix of conformed dimensions, prioritizing rapid delivery. The Inmon approach builds a normalized enterprise data warehouse first and then derives subject-area marts, prioritizing data integrity and a single source of truth. Data Vault is another methodology emphasizing agility, scalability, and auditability through hubs (business keys), links (relationships), and satellites (descriptive attributes with history).
Apache Spark is a distributed computing framework for large-scale data processing with APIs in Python (PySpark), Scala, Java, and R. It supports batch processing, stream processing, machine learning (via MLlib), and graph processing. Spark's key advantage is in-memory computation, which makes it significantly faster than Hadoop MapReduce for many workloads. The Spark DataFrame is a distributed collection of data organized into named columns with a high-level API for transformations and actions, allowing complex pipelines to be expressed concisely in Python and Scala.
Spark executes transformations in two flavors. Narrow transformations, such as map and filter, operate within a single partition without network shuffling. Wide transformations, such as groupBy or a join with different keys, require data to be reshuffled across partitions. Shuffles are the most expensive operation in Spark because they write data to local disk and transfer data between executors, so minimizing wide transformations is the primary lever for performance. When one side of a join is small enough to fit in memory, a broadcast join copies it to every executor and avoids shuffling the large side. Data skew—where some keys hold disproportionately more data—causes stragglers and OOM errors; common mitigations include broadcast joins, salting keys with a random prefix to distribute hot keys across partitions, and choosing partitioning keys with high cardinality.
Apache Flink is a distributed stream processing framework designed for stateful, real-time processing with low latency. Unlike Spark's micro-batch approach, Flink processes events one at a time with true streaming semantics, supporting event-time processing, exactly-once guarantees, and complex event processing. Apache Beam provides a unified programming model that can run on multiple engines, including Flink, Spark, and Google Cloud Dataflow, making it attractive when portability matters. Stateful stream processing operators maintain information across events—running counts, last-seen values, or session windows—and that state is checkpointed to durable storage for fault tolerance. Window processing groups streaming events into finite sets for aggregation, with common window types being tumbling (fixed, non-overlapping), sliding (overlapping intervals), and session (dynamic, activity-gap-based).
A core distinction in stream processing is between event time and processing time. Event time is the timestamp embedded in the data, while processing time is the wall-clock time at which the system processes the event; ingestion time is the time the event enters the pipeline. Watermarks are lower-bound timestamps that indicate how long the engine is willing to wait for late-arriving data, enabling deterministic window evaluation. Late-arriving data can be dropped, used to update results, or appended to a separate "late" table for later correction. Backpressure is a flow-control mechanism in which a slow consumer signals upstream producers to slow down when its buffer fills, preventing OOM errors. Checkpoints are durable snapshots of state and source offsets written periodically to reliable storage, allowing recovery from the last snapshot; a write-ahead log (WAL) instead logs every change before it is applied. Many systems use both: WAL for ongoing durability and checkpoints to bound recovery time. A transaction is a single unit of work with ACID guarantees, while a micro-batch is a small group of records processed together at fixed intervals, trading latency for simpler exactly-once semantics. In Spark Structured Streaming, a trigger controls how often a streaming query produces micro-batches, with options like processingTime, once, or continuous.
Apache Kafka is a distributed event streaming platform used for building real-time data pipelines. It operates on a publish-subscribe model in which producers write messages to topics and consumers read from them, with high throughput, fault tolerance through replication, and message durability. A topic is a named category or feed of messages, divided into partitions—ordered, immutable sequences of messages that enable parallelism and scalability. Each message in a partition is assigned a sequential offset, and partitions allow multiple consumers to read concurrently.
Consumers organize themselves into consumer groups, in which each partition is assigned to exactly one consumer, enabling parallel processing within the group. If a consumer fails, Kafka rebalances the partitions among the remaining consumers, and different consumer groups independently consume the same messages—useful for fanning out the same stream to multiple downstream systems. The ISR (in-sync replica) set is the collection of replicas for a partition that are caught up with the leader; the leader waits for acknowledgments from replicas in the ISR before considering a write durable. The acks setting on producers controls durability: acks=0 means fire-and-forget (lowest latency), acks=1 waits only for the leader, and acks=all waits for all in-sync replicas for the strongest guarantee.
Kafka offers two distinct retention mechanisms. Time- or size-based retention discards old messages regardless of content, while log compaction retains only the latest value for each key, making it ideal for change logs and slowly changing state. Retention is evaluated at segment boundaries, where log.segment.bytes controls the maximum size of an individual segment file on disk; old messages may briefly exceed the retention time until the segment closes. Kafka's transactional producer uses a transaction coordinator and an __transaction_state topic to atomically commit reads and writes across partitions, providing exactly-once delivery so that either all messages in a transaction are visible to read-committed consumers or none are.
Delivery guarantees exist on a spectrum. At-most-once delivery may lose messages but never duplicates them. At-least-once delivery never loses messages but may duplicate them. Exactly-once delivery processes each event exactly one time, requiring idempotent sinks or transactional output plus checkpointing of source offsets. A dead-letter queue (DLQ) is a special destination for messages that cannot be processed successfully after a number of retries, isolating poison messages so they do not block the main pipeline. When choosing a streaming sink (Kafka, S3, a database), key considerations are delivery guarantees, throughput, latency, and schema stability; sinks that support transactions (Kafka, Delta Lake) enable end-to-end exactly-once, while generic sinks usually require idempotency at the destination. Apache Flink and Kafka Streams both provide tools for stream processing: Kafka Streams is a client library that runs inside a Java application tightly coupled to Kafka topics, while Flink is a standalone distributed engine supporting many sources and sinks with more advanced state management.
Efficient analytics depend on how data is physically stored and read. Columnar storage organizes data by column rather than by row, which is highly efficient for analytics because queries typically read only a subset of columns. This layout also enables better compression ratios (similar values are stored together) and faster aggregation queries. Apache Parquet is an open-source columnar storage file format optimized for analytics workloads, supporting efficient compression and encoding schemes, nested data structures, and predicate pushdown for fast query filtering. Parquet is the dominant format in big data ecosystems with tools like Spark, Hive, Presto, Trino, and cloud data lakes. ORC (Optimized Row Columnar) provides similar capabilities with tight Hive integration and strong predicate pushdown via zone maps. Apache Avro, by contrast, is a row-based serialization format that stores data with its schema in the same file and supports schema evolution, making it well suited to Kafka message serialization and data exchange between systems. Avro, Parquet, and table formats like Iceberg and Delta Lake all support schema evolution, allowing pipelines to adapt to upstream changes gracefully.
Apache Arrow is a cross-language, columnar in-memory data format with zero-copy reads, eliminating serialization overhead when moving data between systems like Spark, Pandas, Polars, and DuckDB. Arrow powers vectorized query engines such as DuckDB, ClickHouse, and Velox, which process data in batches of rows (vectors) rather than one row at a time, using SIMD CPU instructions to dramatically reduce interpretation overhead. Row-oriented engines process operators one row at a time, suited for OLTP, while column-oriented engines process data column-by-column, ideal for analytics that touch few columns of many rows. Compression algorithms make further trade-offs: Snappy is fast with a modest ratio (Google-developed, common with Parquet), Gzip has higher ratio but is slower with universal compatibility, and Zstd achieves both high ratio and fast speed (Facebook-developed), making it increasingly preferred for analytics. A row group in Parquet (or stripe in ORC) is a horizontal batch of rows typically 64–256 MB in size, and min/max statistics stored per row group enable predicate pushdown to skip entire groups; larger row groups improve compression but worsen read amplification, while smaller ones give finer-grained skipping at the cost of more metadata.
Query performance also depends on intelligent data organization. Data partitioning divides a large dataset into smaller segments based on a key such as date, region, or ID range, enabling partition pruning—only scanning relevant partitions. Common strategies include range, hash, and list partitioning, and pruning works best when queries always include the partition key. Predicate pushdown pushes filter conditions down to the storage layer so irrelevant rows are excluded before being read into memory. Zone maps (min/max indexes) extend this idea to ORC stripes and other columnar formats. Bloom filters provide a probabilistic test for set membership and are used in HBase, RocksDB, and Parquet to skip whole row groups or data files that cannot contain a value. Data sharding horizontally splits data across independent servers, while partitioning within a single system is internal to one engine. The small files problem occurs when a distributed file system holds millions of tiny files, each consuming metadata slots (in HDFS, the NameNode RAM) and causing excessive seek overhead; solutions include compacting into larger files, using Parquet or sequence files, and using columnar table formats like Iceberg or Delta that pack many records per file. Hadoop HDFS stores large files across commodity cluster nodes with block-level replication managed by a NameNode, while cloud object stores like S3 provide virtually unlimited object storage over HTTP APIs with eleven nines of durability and no cluster to manage—now preferred for data lakes due to scalability, cost, and decoupling of storage from compute.
Modern warehouses also rely on physical design choices that affect performance. In shared-nothing architectures (Snowflake, Redshift, BigQuery), each node has its own CPU, memory, and disk; queries parallelize across nodes that exchange data over the network. In shared-disk architectures (traditional Oracle RAC), all nodes access the same storage and the bottleneck is usually the storage network. Separation of storage and compute decouples where data is persisted (object storage) from where queries are processed (ephemeral compute clusters), letting you scale each independently and run multiple engines against the same data. Snowflake uses micro-partitions—immutable 50–500 MB compressed columnar units with min/max metadata—to enable pruning without requiring user-defined indexes, and a virtual warehouse can be resized or scaled out on the fly. Redshift uses a sort key to determine physical row order (with zone-map pruning) and a distribution key to control how rows spread across nodes: KEY co-locates joins, ALL copies small tables to every node, and EVEN round-robins. A workload manager (WLM) divides a warehouse's compute into queues with different priorities and concurrency levels, protecting critical SLAs from noisy neighbors. A star join optimization recognizes a star schema and broadcasts small dimension tables to all nodes while distributing the large fact table, avoiding shuffling the fact table. Tables can be internal (managed), where the engine controls storage and dropping the table deletes the data, or external, where the data lives outside the engine's control and dropping only removes the registration—standard for data lakes where data should outlive any single engine.
Workflow orchestration is what turns individual scripts into reliable, scheduled, and observable production systems. Apache Airflow is an open-source platform for authoring, scheduling, and monitoring data pipelines. Pipelines are defined as DAGs (Directed Acyclic Graphs) in Python code, where each node represents a task (such as extracting data or running a transformation) and edges define the execution order. Airflow provides a web UI for monitoring, supports retries and alerting, and integrates with cloud services, databases, and processing frameworks. DAGs ensure tasks run in the correct sequence and enable parallel execution of independent tasks. Backfilling—the process of running a pipeline for historical time periods that were missed or need to be reprocessed—is supported via commands like airflow dags backfill, and idempotent pipelines make backfilling safe and predictable.
Idempotency is the property that running a pipeline operation multiple times with the same input produces the same result without side effects. An idempotent load uses INSERT ... ON CONFLICT DO UPDATE or replaces an entire partition, allowing safe retries after failures without creating duplicate data. An incremental load processes only new or changed data since the last run rather than reloading the entire dataset, using markers like timestamps, sequence numbers, or CDC logs to detect changes. Incremental loads are far more efficient than full loads for large datasets and reduce processing time and resource consumption. Change Data Capture (CDC) propagates row-level changes—inserts, updates, deletes—from a source database to downstream systems. CDC methods include log-based reading of database transaction logs (Debezium, AWS DMS), trigger-based capture, and timestamp-based polling. Log-based CDC is least intrusive because it reads existing transaction logs without adding load to the source. Debezium is the de facto standard open-source log-based CDC platform, reading Postgres WAL, MySQL binlog, and MongoDB oplog and publishing every change as a Kafka message. AWS DMS provides managed CDC replication for AWS-centric stacks.
The transformation layer increasingly lives inside the warehouse. dbt (data build tool) is an open-source transformation tool that lets analysts and engineers transform data using SQL SELECT statements, handling materializations (tables, views, incremental models), testing, documentation, and dependency management. dbt follows software engineering practices like version control, code review, and CI/CD for analytics code. Within SQL, several patterns appear repeatedly. An upsert writes a row to a target table, inserting it if new and updating it if the key already exists; implementations include INSERT ... ON CONFLICT DO UPDATE in Postgres, MERGE in SQL Server, Snowflake, and Delta Lake, PUT in DynamoDB, and replace-by-key in Kafka log-compacted topics. UPDATE changes values in rows matching a predicate, while MERGE (also called UPSERT) combines INSERT, UPDATE, and DELETE in a single statement by matching source rows to target rows by key—preferred in data warehousing for handling both new and changed rows atomically. Deduplication removes duplicate records that result from retries, out-of-order delivery, or multi-source joins; common methods include ROW_NUMBER() OVER (PARTITION BY key ORDER BY ts DESC) in SQL and dropDuplicates in Spark, while an upsert then writes the deduped latest state to the warehouse. Other useful SQL patterns include CTEs (Common Table Expressions) for improving readability of complex queries and enabling recursion, UNION ALL for appending results without the cost of deduplication, and the distinction between ROW_NUMBER, RANK, and DENSE_RANK for assigning positions to tied rows. Materialized views precompute and physically store query results to speed up repeated queries, while a regular view runs its query on every access and a cache is an application-managed copy keyed by query parameters. Query result caching in Snowflake and BigQuery automatically returns identical query results with zero compute cost within a window, encouraging query reuse.
Data quality is the foundation of trustworthy analytics, encompassing accuracy, completeness, consistency, timeliness, and validity. Poor data quality leads to incorrect analytics, bad business decisions, and compliance risks. Key practices include data validation, profiling, anomaly detection, and quality checks at each pipeline stage using tools like Great Expectations and dbt tests. Data profiling examines a dataset to collect statistics—data types, null counts, unique values, distributions, min/max values, and patterns—and is an essential first step to identify quality issues before building pipelines. Great Expectations is an open-source Python library that lets you define declarative assertions (expectations) about data, generate quality reports, and integrate with orchestrators like Airflow to catch issues before bad data reaches downstream systems.
Data observability extends these ideas by monitoring a data system's health across five pillars: freshness, volume, schema, quality, and lineage. Tools like Monte Carlo, Great Expectations, and Datafold detect anomalies, broken pipelines, and silent data corruption. Data downtime is the period during which data is incomplete, inaccurate, missing, or stale—analogous to website downtime but often invisible until wrong dashboards are noticed. A data SLI (Service Level Indicator) is a quantitative measure of pipeline health (such as "freshness" or "% of nulls in column X"), and a data SLO (Service Level Objective) is a target for that indicator (such as "99% of dashboards updated within 1 hour"), making data reliability a first-class engineering concern.
Governance and discoverability round out the picture. Data governance is a framework of policies, processes, and standards covering data quality, security, privacy, compliance (such as GDPR), access control, and metadata management. Data lineage tracks the origin, movement, and transformation of data throughout its lifecycle, answering "where did this data come from?" and "what transformations were applied?"; it is essential for debugging, impact analysis, and regulatory compliance. Tools like OpenLineage and dbt provide lineage capabilities. A data catalog is an organized inventory of data assets providing metadata, lineage, descriptions, and search capabilities, helping engineers and analysts discover and trust datasets. Popular tools include Apache Atlas, AWS Glue Data Catalog, Alation, and DataHub. A data contract is an explicit agreement between data producers and consumers about the schema, semantics, SLAs, and ownership of a dataset, the data equivalent of an API contract for data.
A schema registry is a central service that stores, versions, and enforces schemas for data streams, especially Kafka topics. The Confluent Schema Registry supports Avro, JSON Schema, and Protobuf with backward, forward, and full compatibility checks, preventing breaking schema changes. Avro is row-based, dynamically typed, and rich in schema evolution, while Protobuf is binary, strongly typed, more compact, and faster to encode but with more rigid schema evolution. Choose Avro for flexibility and broad tooling, Protobuf for performance and typed APIs. The final layer is decision support: a dashboard is an interactive, real-time view of metrics designed for ongoing monitoring and exploration, while a report is a static, periodic deliverable summarizing data over a period. A semantic layer is a centrally defined, metric-aware layer between raw data and BI tools that defines business concepts (such as "active customer" or "net revenue") as code, ensuring every dashboard uses the same definition; tools include dbt Semantic Layer, Cube, and LookML. A metric store catalogs, versions, and serves canonical business KPIs with logic, dimensions, and time grain, complementing the semantic layer with first-class metric governance.
Several architectural patterns have emerged to address the scale, diversity, and real-time demands of modern data. The medallion architecture, popularized by Databricks, organizes a data lake into three layers: Bronze holds raw, immutable data exactly as it arrived from sources (the system of record); Silver contains cleaned, enriched, deduplicated, and conformed data that answers "what is the current state of the business?"; and Gold holds business-level aggregates and curated datasets ready for BI, ML, and reverse ETL. Each layer applies progressively more transformation, providing clear separation of concerns and traceability.
Data mesh is a decentralized architecture paradigm proposed by Zhamak Dehghani. It treats data as a product owned by domain teams rather than centralized data teams, organized around four principles: domain-oriented ownership, data as a product, self-serve data infrastructure, and federated computational governance. Data mesh pushes responsibility for data quality and discoverability to the teams closest to the data, addressing the bottlenecks of centralized data teams. Reverse ETL moves data from a warehouse back into operational systems like CRM, marketing, and support platforms, putting warehouse-curated customer, product, and event data into the tools frontline teams use daily. Tools like Hightouch and Census specialize in this pattern. A feature store is a centralized system that stores, versions, and serves ML features for both training and real-time inference, providing low-latency online serving and point-in-time correct offline retrieval to prevent training-serving skew.
Event-driven architectures underpin many of these patterns. In a request-response architecture, services synchronously call each other and wait for replies, coupling, latency, and failure modes compound. In an event-driven architecture, services publish events to a broker (Kafka, SNS) and react asynchronously, decoupling producers from consumers and enabling independent scaling. The outbox pattern solves dual-write consistency between a database and a message broker by writing the message to an outbox table in the same transaction; a separate process (such as Debezium) tails the outbox and publishes to Kafka, ensuring at-least-once delivery. The saga pattern manages distributed transactions across services by sequencing local transactions with compensating actions, in either orchestration (a central coordinator) or choreography (services react to events) style. CQRS (Command Query Responsibility Segregation) splits a system into separate write and read models, often paired with event sourcing, which persists the sequence of state changes as events rather than storing current state—offering full audit trail and time travel at the cost of query complexity.
Specialized analytical databases round out the modern stack. Apache Druid is a real-time analytics database optimized for sub-second OLAP queries on high-cardinality time-series and event data, with streaming ingestion from Kafka and pre-aggregation via roll-ups. Apache Pinot is similar, designed for low-latency user-facing analytics with upserts and star-tree indexes. ClickHouse is an open-source columnar OLAP database delivering extremely fast analytical queries on petabyte-scale data using vectorized execution and MergeTree storage engines, popular for observability, ad analytics, and real-time reporting. TimescaleDB turns Postgres into a time-series database via hypertables and continuous aggregates, fully SQL-compatible. InfluxDB is a purpose-built time-series database for high-ingest metrics and IoT data with a custom line protocol and TSI indexes. The fundamental choice between a database, a data warehouse, and a lakehouse comes down to access patterns and data variety: databases optimize for OLTP, warehouses for OLAP over structured data, and lakehouses for flexibility with warehouse-style features. Finally, Google Cloud Dataflow provides pre-built pipeline templates that can be launched repeatedly with different parameters, encapsulating best-practice patterns like Pub/Sub to BigQuery for standard ingestion.
df = spark.read.parquet("data.parquet") followed by df.filter(df.age > 30).groupBy("city").count().dim_date joined three times as order_date, ship_date, and delivery_date. It is implemented with multiple foreign keys in the fact table referencing the same dimension.Drill this topic
170 flashcards on Data Engineering — free, no signup needed to start.
Study Data Engineering flashcardsLearnWiki pages are generated with AI assistance from LearnCoachAssist's reviewed study catalog and may contain errors — verify anything critical against your course materials.