Files
merica-pipelines/docs/dbt_modeling_guide.md
T

87 lines
2.3 KiB
Markdown
Raw Normal View History

# 🧊 Panduan Pemodelan Data Medallion dbt (Lakehouse Transformations)
Dokumen ini menjelaskan struktur dan konvensi penulisan model transformasi **dbt** (Data Build Tool) pada platform MERICA Data Lakehouse.
---
## 1. Konvensi Penamaan Model Medallion
Transformasi dbt diorganisasikan ke dalam subdirektori `dbt/models/`:
```text
dbt/models/
├── silver/
│ ├── silver_environmental_permits_clean.sql
│ ├── silver_gws_waste_reports_clean.sql
│ └── silver_spku_sensor_clean.sql
└── gold/
├── gold_permits_summary_daily.sql
├── gold_waste_management_summary.sql
└── gold_ispu_daily_summary.sql
```
| Layer | Prefix Penamaan | Tujuan & Prinsip Transformasi |
| :--- | :--- | :--- |
| **Silver** | `silver_` atau `int_` | **Pembersihan & Deduplikasi**: Casting tipe data yang konsisten, penanganan nilai null, pemfilteran duplikasi menggunakan `ROW_NUMBER() OVER (PARTITION BY pk ORDER BY updated_at DESC) WHERE rn = 1`. |
| **Gold** | `gold_` atau `fct_` | **Data Marts & Agregasi**: Menggabungkan dimensi dan fakta untuk metrik kepatuhan, laporan harian, KPI eksekutif, dan dashboard visualisasi. |
---
## 2. Contoh Struktur Model Silver
Berkas `dbt/models/silver/silver_environmental_permits_clean.sql`:
```sql
{{ config(
materialized='table',
schema='silver'
) }}
WITH source_data AS (
SELECT
permit_number,
UPPER(TRIM(company_name)) AS company_name,
permit_type,
CAST(issued_date AS DATE) AS issued_date,
UPPER(TRIM(status)) AS status,
updated_at,
ROW_NUMBER() OVER (
PARTITION BY permit_number
ORDER BY updated_at DESC
) AS row_num
FROM {{ source('bronze', 'environmental_permits') }}
)
SELECT
permit_number,
company_name,
permit_type,
issued_date,
status,
updated_at
FROM source_data
WHERE row_num = 1
```
---
## 3. Contoh Struktur Model Gold
Berkas `dbt/models/gold/gold_permits_summary_daily.sql`:
```sql
{{ config(
materialized='table',
schema='gold'
) }}
SELECT
permit_type,
status,
COUNT(permit_number) AS total_permits,
MIN(issued_date) AS earliest_issued,
MAX(issued_date) AS latest_issued,
NOW() AS calculated_at
FROM {{ ref('silver_environmental_permits_clean') }}
GROUP BY permit_type, status
ORDER BY total_permits DESC
```