Topik ini membahas arsitektur lakehouse beserta pola medallion yang menata data di dalamnya menjadi tiga lapisan, yaitu bronze, silver, dan gold. Pembahasannya dimulai dari persoalan yang diselesaikan lakehouse, dilanjutkan fungsi setiap lapisan, dan ditutup dengan simulasi tiga lapisan tersebut. Simulasi itu benar-benar membangun berkas Parquet kecil dan membacanya ulang di sandbox, sehingga aliran datanya terlihat pada keluaran nyata.
Lakehouse: dua dunia yang disatukan#
Data lake adalah penyimpanan berkas terbuka pada penyimpanan objek yang menampung data dalam volume besar dengan biaya murah dan format apa adanya. Data warehouse adalah sistem tabel SQL terstruktur yang cepat untuk analisis tetapi mahal dan biasanya tertutup formatnya. Selama bertahun-tahun organisasi memelihara keduanya sekaligus, sehingga data yang sama disalin ke dua dunia dan harus diselaraskan terus-menerus.
Lakehouse adalah arsitektur yang menyimpan tabel pada format terbuka di penyimpanan objek, sehingga kueri SQL analitik dan komputasi besar berjalan di atas data yang sama tanpa salinan kedua. Format berkas kolom seperti Parquet menjadi tulang punggungnya, sedangkan format tabel terbuka seperti Delta Lake, Apache Iceberg, dan Apache Hudi menambahkan lapisan transaksi, evolusi skema, dan riwayat versi di atas berkas-berkas tersebut. Dengan susunan ini, fleksibilitas data lake dan kecepatan warehouse tidak lagi harus dipilih salah satu.
Karena seluruh data kini hidup di satu tempat yang terbuka, kebutuhan baru muncul pada sisi penataannya, yaitu bagaimana data mentah yang bercampur dibereskan menjadi tabel yang siap dianalisis tanpa menghilangkan jejak aslinya. Penataan itu juga menjaga jejak asal data tetap tersedia ketika logika di atasnya berubah. Jawaban yang dipakai luas adalah pola pelapisan bernama medallion.
Pola medallion: bronze, silver, gold#
Arsitektur medallion, kadang disebut pola multi-hop karena data melompat satu lapisan demi satu lapisan, menata data lakehouse menjadi tiga lapisan berurutan yang makin bersih dan makin termodel. Diagram berikut menggambarkan aliran datanya dari sumber hingga konsumen.
Lapisan bronze menyimpan data mentah persis seperti tiba dari sumbernya, dalam jumlah dan bentuk aslinya, dan hanya bertambah tanpa mengubah baris lama. Fungsinya adalah jejak sumber yang dapat diputar ulang, baik untuk membangun ulang lapisan atas ketika logikanya berubah maupun untuk menyelidiki keanehan data. Apabila lapisan ini langsung dibersihkan, kesempatan menelusuri ke belakang hilang bersama baris mentahnya.
Lapisan silver memuat data yang telah dibersihkan sekali untuk semua, meliputi deduplikasi, pembetulan tipe data, penanganan nilai tidak sah, dan penyatuan rekaman dari beberapa sumber. Logika pembersihan terkonsentrasi di batas bronze menuju silver, sehingga tidak ditulis ulang di banyak model. Lapisan gold memuat agregat yang termodel untuk kebutuhan konsumen, lazimnya dalam bentuk star schema atau tabel lebar, dan karenanya menyerupai lapisan konsumsi warehouse tradisional.
Demonstrasi tiga lapis dengan Parquet#
Skrip berikut menyimulasikan ketiga lapisan dengan berkas Parquet kecil pada ranah sensor suhu. Lapisan bronze ditulis dengan pyarrow apa adanya, termasuk satu bacaan rusak bernilai -999.0 dan satu baris duplikat. Transformasi bronze menuju silver serta silver menuju gold dikerjakan DuckDB melalui perintah COPY, dan isi setiap lapisan dicetak dari berkasnya kembali.
"""Menyimulasikan lapisan bronze, silver, dan gold dengan berkas Parquet kecil."""
from datetime import datetime
import duckdb
import pyarrow as pa
import pyarrow.parquet as pq
# Lapisan bronze: data mentah persis seperti tiba dari sumbernya
bacaan = [
("T1", datetime(2026, 2, 2, 8, 0), 26.5),
("T1", datetime(2026, 2, 2, 8, 10), 26.7),
("T2", datetime(2026, 2, 2, 8, 0), 27.2),
("T2", datetime(2026, 2, 2, 8, 10), -999.0), # nilai rusak dari sensor
("T2", datetime(2026, 2, 2, 8, 20), 27.0),
("T1", datetime(2026, 2, 2, 8, 10), 26.7), # baris duplikat
]
bronze = pa.table({
"sensor": pa.array([b[0] for b in bacaan], pa.string()),
"ts": pa.array([b[1] for b in bacaan], pa.timestamp("s")),
"suhu_c": pa.array([b[2] for b in bacaan], pa.float64()),
})
pq.write_table(bronze, "bronze.parquet")
con = duckdb.connect(":memory:")
def cetak_lapisan(nama, berkas):
print(f"Lapisan {nama} ({berkas}):")
rows = con.execute(
f"SELECT sensor, ts, suhu_c FROM '{berkas}' ORDER BY sensor, ts"
).fetchall()
for sensor, ts, suhu in rows:
print(f" {sensor} {ts:%Y-%m-%d %H:%M} {suhu:7.1f}")
cetak_lapisan("bronze", "bronze.parquet")
# Lapisan silver: buang duplikat dan nilai di luar rentang wajar sensor suhu
con.execute("""
COPY (
SELECT DISTINCT sensor, ts, suhu_c
FROM 'bronze.parquet'
WHERE suhu_c BETWEEN -50.0 AND 60.0
) TO 'silver.parquet' (FORMAT PARQUET)
""")
cetak_lapisan("silver", "silver.parquet")
# Lapisan gold: agregat siap pakai bagi konsumen data
con.execute("""
COPY (
SELECT sensor, COUNT(*) AS jumlah_baca, ROUND(AVG(suhu_c), 1) AS rata_suhu
FROM 'silver.parquet'
GROUP BY sensor
) TO 'gold.parquet' (FORMAT PARQUET)
""")
print("Lapisan gold (gold.parquet):")
rows = con.execute("SELECT sensor, jumlah_baca, rata_suhu FROM 'gold.parquet' ORDER BY sensor").fetchall()
for sensor, jumlah, rata in rows:
print(f" {sensor} jumlah_baca={jumlah} rata_suhu={rata:.1f}")Lapisan bronze (bronze.parquet):
T1 2026-02-02 08:00 26.5
T1 2026-02-02 08:10 26.7
T1 2026-02-02 08:10 26.7
T2 2026-02-02 08:00 27.2
T2 2026-02-02 08:10 -999.0
T2 2026-02-02 08:20 27.0
Lapisan silver (silver.parquet):
T1 2026-02-02 08:00 26.5
T1 2026-02-02 08:10 26.7
T2 2026-02-02 08:00 27.2
T2 2026-02-02 08:20 27.0
Lapisan gold (gold.parquet):
T1 jumlah_baca=2 rata_suhu=26.6
T2 jumlah_baca=2 rata_suhu=27.1Keluaran bronze memuat enam baris yang persis seperti tiba dari sensor, lengkap dengan nilai -999.0 dan duplikat yang justru disengaja ada karena lapisan ini tidak boleh menyunting apa pun. Keluaran silver menyisakan empat baris setelah duplikat dibuang dan nilai di luar rentang wajar sensor suhu dikeluarkan. Keluaran gold meringkasnya menjadi satu baris per sensor berisi jumlah bacaan dan rata-rata suhunya, bentuk yang siap dipakai dasbor. Ketiga lapisan berbentuk berkas Parquet biasa yang dibaca langsung oleh DuckDB tanpa server, dan itulah sifat dasar lakehouse.
Kesalahan umum#
Tiga kesalahan berikut paling sering muncul ketika pola medallion pertama kali diterapkan.
- Membersihkan data sebelum masuk bronze. Penyebabnya, keinginan membuat lapisan pertama rapi menghapus baris mentah, sehingga tidak ada cara memutar ulang lapisan atas ketika logika pembersihannya ternyata keliru. Perbaikannya, simpan data apa adanya di bronze dan pindahkan seluruh pembersihan ke batas menuju silver.
- Menulis ulang logika pembersihan di setiap model gold. Penyebabnya, gold langsung dibangun dari bronze demi cepat, sehingga deduplikasi dan validasi tersebar dan mulai berbeda antar model. Perbaikannya, pusatkan pembersihan di silver dan jadikan gold hanya agregasi serta pemodelan untuk konsumen.
- Menumpuk tabel gold tanpa konsumen jelas. Penyebabnya, agregasi dibuat lebih dulu sebelum kebutuhannya ada, sehingga biaya penyimpanan dan pemeliharaan tumbuh tanpa nilai. Perbaikannya, bangun tabel gold dari pertanyaan konsumen yang nyata dan pensiunkan yang tidak lagi dipakai.
Ringkasan#
- Lakehouse menyimpan tabel berformat terbuka di penyimpanan objek sehingga analitik SQL dan komputasi besar berjalan di atas satu salinan data.
- Pola medallion menatanya menjadi tiga lapisan, yaitu bronze untuk data mentah apa adanya, silver untuk data yang dibersihkan sekali untuk semua, dan gold untuk agregat termodel.
- Batas bronze menuju silver menampung seluruh logika pembersihan, sedangkan batas silver menuju gold menampung logika bisnis dan agregasi.
- Demonstrasi menunjukkan ketiga lapisan dalam berkas Parquet kecil, dari enam baris mentah, empat baris bersih, hingga satu baris agregat per sensor.
Referensi#
- What is a medallion architecture? — Databricks — Dokumentasi resmi Databricks yang menjelaskan lapisan bronze, silver, dan gold beserta tujuannya.
- Parquet files — DuckDB — Dokumentasi pembacaan dan penulisan berkas Parquet yang dipakai demonstrasi untuk menelusuri setiap lapisan.
- COPY Statement — DuckDB — Dokumentasi perintah COPY yang dipakai demonstrasi untuk menulis lapisan silver dan gold.