Proyek pipeline yang gagal hampir selalu gagal sejak awal: bukan karena kodenya salah, tetapi karena kebutuhannya tidak pernah ditulis. Pada bagian ini kita memperlakukan pekerjaan data engineer sebagaimana seharusnya: memahami data sumber, menetapkan kriteria berhasil yang terukur, dan menetapkan batas sebelum menulis kode. Pembahasan kita berpindah dari konsep Merancang Data Pipeline dan Ingestion dari File yang telah dipelajari, menjadi satu keputusan konkret untuk TokoKita.

Skenario: Ekspor CSV TokoKita #

Sistem order TokoKita adalah aplikasi warisan yang tidak punya API. Satu-satunya cara mengambil datanya adalah ekspor CSV bulanan ke folder bersama. Dua berkas yang kita terima berisi kolom berikut:

text
order_id, tanggal, pelanggan, email, produk, kategori, jumlah, harga, status

Pembacaannya di pipeline memakai modul csv bawaan Python; format CSV sendiri sudah dibahas pada chapter CSV.

Tim analitik tidak bisa memakai berkas tersebut langsung karena tiga hal. Pertama, jumlah baris tidak dapat dipercaya: pesanan yang sama bisa muncul dua kali. Kedua, tipe data tidak konsisten: angka kadang ditulis dengan pemisah ribuan, status kadang huruf kecil kadang huruf besar. Ketiga, sebagian baris berisi nilai yang tidak masuk akal untuk dibaca analitik.

Audit Data Mentah #

Kita membaca kedua berkas baris demi baris dan mengelompokkan temuan. Hasilnya menjadi daftar masalah yang harus dijawab pipeline:

Jenis kotoranContoh nyata di berkasDampak jika dibiarkan
Duplikat persisORD-2024-0004 muncul 2 kali di berkas JuniOmzet terhitung ganda
Duplikat lintas berkas3 pesanan Juni diekspor ulang di berkas JuliBaris tabel membengkak
Konflik kunciORD-2024-0046 isi berbeda antar berkasAnalitik tidak tahu versi mana yang benar
Nilai kosongemail kosong, harga kosong, tanggal kosongKolom wajib menjadi tidak dapat dipakai
Nilai mustahiljumlah -2, tanggal 2024-06-31Agregasi menghasilkan angka negatif
Format bervariasi210.000 vs 210000, selesai vs SELESAIFilter dan GROUP BY terpecah
Pola tidak sesuaiORD-2024-631, budi(at)example.comKunci join tidak bisa dipakai

Berkas Latihan dan Bentuknya #

Dua berkas latihan disusun menyerupai ekspor nyata: total 218 baris dengan produk, pelanggan, dan status yang masuk akal. Kotoran sengaja ditanam dengan jumlah yang tercatat, sehingga setiap aturan pipeline punya contoh hidup dan setiap angka pada Bagian 9 dapat dijelaskan:

BerkasBarisBaris galatBaris kotor tetapi validDuplikat tertanam
pesanan_2024-06.csv1071632 persis
pesanan_2024-07.csv111522 persis, 3 lintas berkas, 1 konflik

Kolom terakhir pada tabel di atas adalah cerita tersendiri. Sistem sumber mengekspor ulang beberapa pesanan akhir Juni ke dalam berkas Juli, dan salah satu ekspor ulang membawa revisi isi yang berbeda dari catatan pertamanya.

Alat dan Prasyarat #

Proyek ini sengaja tidak memakai dependensi berat. Seluruh kebutuhan sudah tersedia di lingkungan tutorial:

AlatPeran
Python 3.12runtime seluruh modul
csv, re, sqlite3 dari stdlibpembacaan, pola, dan basisdata lokal
pytestkerangka pengujian
PyYAMLpembacaan config/pipeline.yaml

Nomor versi boleh berbeda di komputer Anda; yang dijaga adalah kompatibilitasnya, bukan angka persisnya.

Kebutuhan dan Kriteria Berhasil #

Dari audit di atas, kita menurunkan kebutuhan menjadi kriteria yang dapat diuji. Setiap baris pada tabel berikut akan diperiksa lagi di Bagian 9:

KebutuhanKriteria terukur
Satu pesanan satu baris0 baris ganda di tabel akhir
Hanya data sehat yang masukBaris gagal validasi ditolak dan dicatat, bukan diperbaiki diam-diam
Nilai konsistenSatu kategori satu ejaan; satu status satu ejaan; angka tanpa pemisah ribuan
Tipe data benarjumlah dan harga bertipe integer, bukan teks
Bisa dijalankan ulangMenjalankan pipeline dua kali tidak menambah baris tabel
TerlacakSetiap keputusan (tolak, buang, muat) tercatat di log
Dapat diverifikasiJumlah baris tabel dapat dihitung dan cocok dengan ringkasan pipeline

Dua kebutuhan terakhir menuntut perhatian khusus. Kata terlacak berarti keputusan yang sama harus menghasilkan jejak yang sama, sehingga kita tahu persis baris mana yang dibuang dan alasannya. Kata dapat dijalankan ulang adalah definisi idempotent yang kita pelajari di Idempotency dan Retries: hasil akhirnya sama, berapa kali pun diulang.

Lingkup dan Batasan #

Yang masuk lingkup proyek ini:

  • membaca seluruh berkas data/pesanan_*.csv,
  • validasi, pembersihan, dan deduplikasi dalam proses Python,
  • pemuatan ke tabel pesanan dengan UPSERT per batch,
  • logging ke konsol dan berkas,
  • pengujian pytest untuk semua lapisan.

Yang sengaja tidak masuk lingkup:

  • perubahan data di sumber (kita tidak menyentuh sistem warisan),
  • orkestrasi terjadwal dan retry otomatis,
  • transformasi analitik lanjutan seperti agregasi harian.

Batasan lingkungan juga perlu diakui sejak awal. Server PostgreSQL tidak tersedia di lingkungan tutorial, sehingga pemuatan yang dijalankan nyata memakai SQLite sebagai kembaran lokal dengan pola SQL yang sama. Modul khusus PostgreSQL tetap disediakan dan diverifikasi sampai kompilasi; penjelasannya ada di Bagian 5.

Cara Membaca Bagian-Bagian Berikutnya #

Tiga kesepakatan berlaku untuk seluruh bagian proyek ini:

  • setiap blok Output yang Dihasilkan adalah hasil eksekusi nyata di lingkungan tutorial, bukan contoh karangan;
  • setiap cuplikan kode diambil dari berkas yang benar-benar ada di src/, tests/, atau config/, dan dapat diunduh dari bagian Berkas Sumber;
  • judul chapter lain yang ditulis miring adalah rujukan silang ke materi pendukung, bukan hiasan kalimat.

Dengan tiga kesepakatan tersebut, angka pada satu bagian selalu dapat diperiksa ulang dari berkas sumbernya.

Peta Sembilan Bagian #

Urutan pengerjaan mengikuti alur data, bukan urutan kenyamanan menulis kode:

  1. Bagian 2 merancang skema tabel: tipe, constraint, dan index.
  2. Bagian 3 membaca dan memvalidasi CSV.
  3. Bagian 4 membersihkan baris yang lolos validasi.
  4. Bagian 5 memuat hasil bersih dengan upsert.
  5. Bagian 6 menangani duplikat lintas berkas.
  6. Bagian 7 menambahkan logging pada seluruh tahap.
  7. Bagian 8 menguji semua lapisan dengan pytest.
  8. Bagian 9 menjalankan pipeline utuh dan membaca hasilnya.

Urutan ini penting karena keputusan skema pada Bagian 2 menjadi rujukan tipe data pada pembersihan Bagian 4 dan pola upsert pada Bagian 5. Materi pendukungnya telah kita bahas di CSV untuk format sumber dan akan diperdalam di Deduplikasi Data serta Pengujian Kode Python.

Dengan kebutuhan yang sudah terukur, langkah berikutnya adalah memberi rumah bagi data tersebut: merancang skema database yang menegakkan aturan sejak tingkat tabel. Lanjutkan ke Bagian 2: Merancang Skema Database.