Data engineering adalah pekerjaan memindahkan, membersihkan, dan menyusun data supaya orang lain bisa menjawab pertanyaan dengan data itu. Bayangin toko buku di jam ramai. Kasir sibuk melayani pembeli satu per satu. Pemilik toko mau tahu buku apa yang paling laku di tiap kota minggu ini. Kalau dia menyuruh kasir membongkar semua struk sekarang juga, antrean macet. Jadi tiap malam ada orang yang memfotokopi struk hari itu, membawanya ke ruang belakang, membuang struk dobel, membetulkan yang salah tulis, lalu menyusunnya per minggu dan per kota. Besok paginya pemilik tinggal membaca. Orang itu data engineer.
🧪 Tebakan cepat: Toko Buku baru punya 14 pesanan. Pemiliknya menjalankan query "buku paling laku per kota per minggu" langsung di database aplikasi, dan hasilnya keluar dalam sekejap: di Jakarta, minggu yang mulai 28 September, juaranya Bumi Manusia dengan 4 buku. Jawaban itu benar atau salah? Tebak dulu, jawabannya ada di bagian "Cepat belum tentu benar".
Toko Buku dan pertanyaan pemiliknya
Toko Buku dari track API sekarang punya aplikasi web sendiri: Laravel dengan database MySQL. Tiap checkout menulis satu baris ke orders dan satu baris per judul ke order_items. Data inilah yang dipakai di seluruh track Data Engineering.
| Tabel | Isinya | Baris |
|---|---|---|
authors |
penulis: Andrea Hirata, Pramoedya Ananta Toer, Eka Kurniawan, Ahmad Tohari | 4 |
books |
Laskar Pelangi (89000), Bumi Manusia (125000), Cantik Itu Luka (110000), Ronggeng Dukuh Paruk (95000) | 4 |
customers |
pelanggan dan kotanya: Jakarta, Bandung, Surabaya | 7 |
orders |
pesanan, created_at dari 28 September sampai 9 Oktober 2026 |
14 |
order_items |
satu baris per judul di tiap pesanan: qty dan price |
19 |
Pemiliknya bertanya: "buku apa paling laku per kota per minggu?" Pertanyaan ini yang mendorong seluruh track: dari query di database aplikasi, ke warehouse, star schema, pengecekan kualitas data, sampai dbt.
Database aplikasi itu OLTP
Database aplikasi disebut OLTP (Online Transaction Processing): kerjanya ribuan query kecil, dan tiap query cuma menyentuh sedikit baris. Checkout menulis 1 pesanan dan 2 item. Halaman "Pesanan saya" membaca 1 pesanan lewat primary key-nya. Database ini juga disebut database produksi: yang dipakai pembeli sungguhan.
Pertanyaan pemilik beda jenis. Namanya OLAP (Online Analytical Processing): sedikit query besar yang membaca semua baris lalu menjumlahkannya per kelompok. Langsung di database produksi, query-nya begini (SQLite, jalan juga di Lab):
SELECT date(o.created_at, 'weekday 0', '-6 days') AS minggu,
c.city AS kota,
b.title AS judul,
SUM(oi.qty) AS terjual
FROM order_items oi
JOIN orders o ON o.id = oi.order_id
JOIN customers c ON c.id = o.customer_id
JOIN books b ON b.id = oi.book_id
GROUP BY minggu, kota, judul
ORDER BY minggu, kota, terjual DESC, judul;
date(o.created_at, 'weekday 0', '-6 days')membulatkan tanggal pesanan ke hari Senin minggunya. Di MySQL ditulisDATE_SUB(DATE(o.created_at), INTERVAL WEEKDAY(o.created_at) DAY). Detailnya di pelajaran SQL untuk Data Engineering.- Tiga
JOINmenyambung empat tabel: item, pesanan, pelanggan (untuk kota), dan buku (untuk judul). GROUP BYdanSUM(oi.qty)menjumlah buku terjual per minggu, kota, dan judul. Karena diurutkanterjual DESC, baris pertama tiap kota adalah juaranya.
Bedanya kelihatan di rencana query SQLite (EXPLAIN QUERY PLAN). Kolom kanan diukur dengan SQLite di laptop, dengan 1 juta baris order_items:
| Query | Rencana SQLite | Di 1 juta baris |
|---|---|---|
| Aplikasi: buka pesanan #6 | SEARCH o USING INTEGER PRIMARY KEY, item lewat index |
sekitar 0,01 milidetik |
| Pemilik: paling laku per kota per minggu | SCAN oi: semua baris dibaca |
sekitar 2,2 detik |
SEARCH artinya langsung lompat ke baris yang dicari. SCAN artinya membaca tabel dari awal sampai akhir. Laporan pemilik sekitar 200 ribu kali lebih lama, dan jalannya di server yang sama dengan checkout. Selama dia jalan, CPU dan disk dipakai bareng pembeli yang sedang bayar. Belum lagi risikonya: orang yang mengetik query analitik di produksi bisa saja salah ketik UPDATE tanpa WHERE.
Cepat belum tentu benar
Ini hasil query tadi untuk minggu 28 September:
| minggu | kota | judul | terjual |
|---|---|---|---|
| 2026-09-28 | NULL | Laskar Pelangi | 1 |
| 2026-09-28 | Bandung | Bumi Manusia | 2 |
| 2026-09-28 | Jakarta | Bumi Manusia | 4 |
| 2026-09-28 | Jakarta | Laskar Pelangi | 3 |
| 2026-09-28 | Surabaya | Cantik Itu Luka | 2 |
(baris peringkat dua Bandung dan Surabaya, serta Ronggeng Dukuh Paruk di Jakarta, gak ditampilkan). Jakarta bilang Bumi Manusia 4 buku, dan itu salah. Itu jawaban tebakannya: query-nya cepat dan gak ada error, tapi jawabannya salah diam-diam. Penyebabnya tiga baris kotor:
- Baris dobel.
order_items9 sama persis dengan baris 8: pesanan 6, Bumi Manusia,qty2. Job antrean yang menyimpan item pesanan gagal di tengah dan diulang, jadi itemnya tersimpan dua kali. Budi cuma beli 2, bukan 4. - Kota kosong. Pelanggan 6, Maya Sari, daftar lewat Google dan belum mengisi alamat. Kotanya
NULL, jadi pesanannya masuk kelompokNULL. - Salah ketik harga.
order_items16 harganya 950000 untuk Ronggeng Dukuh Paruk yang harganya 95000. Jumlah bukunya gak terpengaruh, tapi omzetnya kelebihan 855.000.
Setelah dibersihkan, Jakarta minggu itu jadi Laskar Pelangi 3, Bumi Manusia 2. Totalnya juga berubah: data mentah bilang 23 buku senilai Rp 3.319.000, yang benar 21 buku senilai Rp 2.214.000.
Pipeline: dari sumber sampai jawaban
Jalur yang membawa data dari tempat lahirnya sampai jadi jawaban disebut pipeline. Bentuknya hampir selalu lima tahap:
| Tahap | Artinya | Di Toko Buku |
|---|---|---|
| Sumber (source) | tempat data lahir | MySQL aplikasi; nanti juga file dari marketplace |
| Ingestion | menyalin data dari sumber, tanpa mengganggunya | tiap malam jam 01.00, salin pesanan kemarin |
| Storage | tempat simpan khusus analitik | data warehouse: database terpisah yang dirancang untuk query besar |
| Transformation | membersihkan dan menyusun | buang baris dobel, kota kosong jadi Tidak diketahui, harga diambil dari katalog |
| Serving | menyajikan ke yang bertanya | tabel ringkasan atau dashboard untuk pemilik |
Hasil transformation-nya satu tabel penjualan di warehouse, dibuat dari salinan mentah raw_order_lines (19 baris pesanan yang sudah disambung dengan pelanggan dan bukunya):
CREATE TABLE penjualan AS
SELECT DISTINCT r.order_id, r.book_id,
date(r.created_at) AS tanggal,
date(r.created_at, 'weekday 0', '-6 days') AS minggu,
COALESCE(r.city, 'Tidak diketahui') AS kota,
r.title AS judul,
r.qty,
b.price AS harga
FROM raw_order_lines r
JOIN books b ON b.id = r.book_id;
DISTINCTmembuang baris yang isinya persis sama. Baris 8 dan 9 jadi satu, jadi tabelnya 18 baris.COALESCE(r.city, 'Tidak diketahui')menggantiNULLdengan teks itu.b.price AS hargamengambil harga dari katalogbooks, jadi salah ketik 950000 gak ikut. Toko ini belum pernah ganti harga dan gak kasih diskon, jadi harga katalog selalu benar.
Laporan pemilik sekarang membaca penjualan di warehouse. Database produksi cuma melayani pembeli.
Data engineer di antara peran lain
| Peran | Kerjanya di Toko Buku | Hasilnya |
|---|---|---|
| Backend developer | membangun checkout dan tabel MySQL-nya | aplikasi yang jalan |
| Data engineer | membangun dan merawat pipeline: menyalin, membersihkan, menyusun data | tabel penjualan yang bersih dan terisi tiap pagi |
| Data analyst | menganalisis data untuk insight bisnis: menjawab pertanyaan, bikin dashboard | "Laskar Pelangi terlaris di Jakarta minggu 28 September" |
| Data scientist | membuat model statistik atau machine learning | perkiraan berapa Bumi Manusia laku minggu depan |
Data engineer gak menganalisis data untuk mencari insight; dia memastikan datanya tersedia, bersih, dan bisa dipakai. Di tim kecil, satu orang sering memegang dua peran sekaligus.
Stack modern, tanpa hype
Tool yang sering kamu dengar, per tahap:
- Ingestion: script Python sendiri, Airbyte (open source), Fivetran (berbayar), Debezium untuk menangkap tiap perubahan baris.
- Storage: warehouse cloud seperti BigQuery, Snowflake, Redshift; ClickHouse; DuckDB yang jalan di laptop. Atau data lake: file Parquet di object storage (S3, GCS, R2).
- Transformation: SQL, dengan dbt untuk mengatur banyak file SQL. Python dengan pandas atau Polars.
- Orkestrasi (yang menjalankan semuanya tepat waktu dan berurutan): cron, Airflow, Dagster, Prefect.
- Serving: Metabase, Apache Superset, Looker Studio.
Untuk toko sebesar ini, cron, satu script Python, dan DuckDB atau Postgres sudah cukup. Tool besar baru masuk akal kalau datanya besar atau pipeline-nya sudah puluhan.
⚠️ Jebakan yang sering ketemu
- Laporan berat langsung di database produksi.
SCANsemua baris di server yang sama dengan checkout. Kalau belum punya warehouse, minimal jalankan di read replica, salinan database yang khusus dibaca. - Percaya data mentah. Baris dobel,
NULL, salah ketik: query tetap jalan tanpa error, jawabannya salah diam-diam. - Pipeline tanpa pengecekan. Load semalam gagal, dashboard tetap tampil dengan angka kemarin, dan gak ada yang sadar. Minimal cek jumlah baris dan tanggal pesanan terakhir tiap pagi.
- Mulai dari tool, bukan dari pertanyaan. Kafka dan Spark untuk 14 pesanan cuma menambah biaya dan kerjaan.
TL;DR: Data engineering adalah memindahkan, membersihkan, dan menyusun data supaya orang lain bisa menjawab pertanyaan. Database aplikasi itu OLTP: banyak query kecil lewat primary key (SEARCH). Pertanyaan pemilik itu OLAP: membaca semua baris (SCAN), jadi lambat dan berisiko kalau dijalankan di produksi, dan tanpa dibersihkan jawabannya bisa salah: baris dobel bikin Bumi Manusia 4, padahal yang benar Laskar Pelangi 3. Pipeline punya lima tahap: sumber, ingestion, storage (warehouse), transformation, serving. Data engineer membangun dan merawat pipeline itu; data analyst memakai datanya untuk insight bisnis; data scientist membuat model.