Data Storage & Performance

Lakehouse

Apresentação

📦 BLOCO 4 — Data Storage & Performance

1️⃣ Columnar vs Row Storage

Existem dois grandes tipos de armazenamento.

Row-based storage

Exemplo:

id | name | country | age
1  | Ana  | PT      | 25
2  | John | US      | 31

Muito usado em: bases OLTP, PostgreSQL, MySQL

Bom para: inserts, updates, transações

Columnar storage

Exemplo conceptual:

id:      [1,2,3,4]
name:    [Ana,John,...]
country: [PT,US,...]
age:     [25,31,...]

Muito usado em: data warehouses, data lakes

Benefícios:

  • ✔ lê apenas colunas necessárias
  • ✔ compressão melhor
  • ✔ scans mais rápidos

Exemplo: SELECT country FROM users — num formato columnar só lê a coluna country.


2️⃣ Formatos importantes

Parquet

O formato mais usado em data engineering.

Características:

  • columnar
  • compressão eficiente
  • schema incluído
  • otimizado para analytics

Exemplo de escrita em Spark:

df.write.parquet("s3://data/users")

Benefícios: menos IO, scans rápidos, compressão alta

Delta Lake

Uma camada sobre Parquet.

Adiciona:

  • ACID transactions
  • versioning
  • time travel
  • schema evolution

Permite coisas como: SELECT * FROM table VERSION AS OF 3

Usado em: Databricks, Microsoft Fabric, Lakehouse architectures

Apache Iceberg

Alternativa moderna ao Delta.

Características: ACID, schema evolution, hidden partitioning, metadata tables

Muito usado em: AWS, Snowflake, Trino, Starburst


3️⃣ Partitioning (muito importante)

Partitioning significa dividir dados em pastas lógicas.

Exemplo:

data/events/
  date=2026-03-05/
  date=2026-03-06/

Query: SELECT * FROM events WHERE date = '2026-03-05'

O sistema lê apenas essa partição.

Isto chama-se: partition pruning

Benefícios:

  • ✔ menos dados lidos
  • ✔ queries mais rápidas
  • ✔ menos custo

Boas práticas de partitioning

Escolher colunas: date, region, customer_id

Evitar: IDs únicos, UUIDs — porque criam milhões de partições pequenas.


4️⃣ Clustering / Sorting

Mesmo dentro de uma partição podemos ordenar dados.

Exemplo: partition: date=2026-03-05, cluster by: country

Benefícios: melhor compressão, scans mais eficientes

BigQuery chama isto: clustering


5️⃣ File sizes (super importante)

Sistemas distribuídos não gostam de ficheiros pequenos.

Problema clássico: Small Files Problem

Exemplo: 100000 ficheiros de 5KB

Problemas: metadata overhead, jobs lentos, muitos open operations

Tamanho ideal de ficheiros: 128MB – 1GB


6️⃣ Compaction

Se tens muitos ficheiros pequenos, faz-se compaction.

Exemplo:

1000 ficheiros de 5MB
↓
20 ficheiros de 250MB

Spark example:

df.repartition(10).write.parquet(...)

7️⃣ Data Skipping

Motores modernos usam metadata para evitar scans.

Exemplo: Se um ficheiro só tem date = 2026-03-01

Uma query WHERE date = '2026-03-10' pode ignorar completamente o ficheiro.

Isto chama-se: predicate pushdown


8️⃣ Predicate Pushdown

Filtros são aplicados antes de ler dados completos.

Exemplo: SELECT * FROM users WHERE country = 'PT'

O engine só lê blocos relevantes.

Funciona bem com: Parquet, ORC, Delta, Iceberg


9️⃣ Data Layout

Layout correto pode reduzir custos brutalmente.

Exemplo mau: events.parquet — tudo num ficheiro

Exemplo bom:

events/
  year=2026/
    month=03/
      day=05/

🔟 Hot vs Cold Data

Estratégia comum:

  • Hot data → queries frequentes
  • Cold data → armazenamento barato

Exemplo: últimos 30 dias → warehouse | dados antigos → data lake


⚠️ Problemas comuns de performance

  • Small files — Milhares de ficheiros pequenos
  • Data skew — Uma partição muito maior
  • Bad partitioning — Exemplo mau: partition by user_id
  • Excessive partitions — Exemplo: partition by timestamp

🧠 Frases que impressionam em entrevistas

Choosing the right partitioning strategy and file size is critical for query performance in data lakes.

Columnar formats like Parquet reduce IO by allowing engines to read only the required columns.


🎯 10 perguntas que podem sair na entrevista

  1. Qual a diferença entre row storage e columnar storage?
  2. Porque é que Parquet é tão usado em data lakes?
  3. O que é partitioning e porque melhora performance?
  4. O que é partition pruning?
  5. Qual o problema dos small files?
  6. Qual o tamanho ideal de ficheiros num data lake?
  7. O que é predicate pushdown?
  8. Qual a diferença entre Parquet e Delta Lake?
  9. Como melhorarias performance de queries num data lake?
  10. O que é compaction e quando usarias?

Perguntas

Sem perguntas. Clica em Editar para adicionar.