🎯 Definicja

Medallion Architecture to wzorzec organizacji danych w Data Lakehouse, który dzieli dane na trzy warstwy jakościowe: Bronze (surowe), Silver (oczyszczone), Gold (zagregowane, gotowe do analizy) — jak rafinowanie metalu od rudy do złota.

🔑 Kluczowe punkty

  • Opracowana przez Databricks dla Delta Lake
  • Każda warstwa buduje na poprzedniej — dane płyną jednokierunkowo
  • Idempotentność: można ponownie przetworzyć dane z Bronze bez utraty informacji
  • Separacja odpowiedzialności: inżynier ładuje Bronze, analityk czyta Gold
  • Implementowana w Delta Lake, Apache Iceberg, Apache Hudi

📚 Szczegółowe wyjaśnienie

Trzy warstwy

Źródła danych
     │
     ▼
┌─────────────────────────────────────────┐
│  BRONZE (Raw Zone)                       │
│  - Dane 1:1 ze źródła (bez zmian)       │
│  - Przechowywane jako Parquet/Delta     │
│  - Pełna historia, append-only          │
│  - Schemat: jak w źródle                │
└─────────────────┬───────────────────────┘
                  │ oczyszczanie, walidacja
                  ▼
┌─────────────────────────────────────────┐
│  SILVER (Cleansed Zone)                  │
│  - Usunięte duplikaty                   │
│  - Oczyszczone typy danych              │
│  - Standaryzowane nazwy kolumn          │
│  - Zwalidowane reguły biznesowe         │
│  - Enrichment (join ze słownikami)      │
└─────────────────┬───────────────────────┘
                  │ agregacje, modele biznesowe
                  ▼
┌─────────────────────────────────────────┐
│  GOLD (Business Zone)                   │
│  - Modele wymiarowe (Star Schema)       │
│  - Agregaty, metryki, KPI              │
│  - Zoptymalizowane pod zapytania BI     │
│  - Konsumowane przez Power BI, Tableau  │
└─────────────────────────────────────────┘

Implementacja z dbt

-- Bronze: surowe dane (ładuje Airbyte/Kafka)
-- models/bronze/raw_orders.sql
SELECT * FROM {{ source('raw', 'orders') }}
 
-- Silver: oczyszczone
-- models/silver/orders.sql
SELECT
    id,
    UPPER(status)           AS status,
    CAST(amount AS DECIMAL) AS amount,
    created_at::DATE        AS order_date
FROM {{ ref('raw_orders') }}
WHERE id IS NOT NULL
 
-- Gold: agregaty
-- models/gold/daily_revenue.sql
SELECT
    order_date,
    COUNT(*)      AS order_count,
    SUM(amount)   AS revenue
FROM {{ ref('orders') }}
GROUP BY 1

Porównanie z Lambda Architecture

CechaMedallionArchitektura Lambda
ZłożonośćNiższaWyższa (batch + stream)
LatencjaMinuty–godzinySekundy
KosztNiższyWyższy
MaintenanceProstszeSkomplikowane (2 pipelines)

💡 Przykład zastosowania

E-commerce Data Platform: Bronze — surowe zamówienia z Shopify przez Airbyte, Bronze — zdarzenia kliknięć z Kafka. Silver — oczyszczone zamówienia + klienci, Silver — sesje użytkowników. Gold — daily_revenue_by_channel, customer_lifetime_value, product_conversion_rate — konsumowane przez Power BI.

📌 Źródła

👽 Brudnopis