Daftar isi
Ini artikel contoh untuk pembelajaran. Tanggal publikasi dan catatan transaksi bersifat ilustratif.
Pipeline ETL mengambil input, mengubahnya, lalu memuat hasil ke tujuan. Untuk latihan pertama, gunakan berkas lokal agar setiap hasil mudah diperiksa. Contoh Python 3.13 ini membaca kolom transaction_id dan amount, lalu menulis baris valid sebagai JSON Lines. Amount memakai satu mata uang yang diasumsikan.
Siapkan input kecil
Simpan sebagai transactions.csv di direktori latihan baru:
transaction_id,amount
T-10,12.50
T-11,invalid
T-12,0
T-13,NaN
Nol tetap valid. NaN tidak berguna sebagai amount transaksi walaupun Decimal dapat membacanya. Karena itu, periksa apakah hasil konversi merupakan angka berhingga.
Transformasi dengan penolakan yang terlihat
import csv
import json
from decimal import Decimal, InvalidOperation
from pathlib import Path
accepted, rejected = [], []
with open('transactions.csv', newline='', encoding='utf-8') as source:
reader = csv.DictReader(source)
if reader.fieldnames != ['transaction_id', 'amount']:
raise ValueError('Expected transaction_id,amount header')
for line, row in enumerate(reader, start=2):
try:
identifier = (row['transaction_id'] or '').strip()
amount = Decimal(row['amount'] or '')
if not identifier or not amount.is_finite():
raise ValueError('Missing identifier or non-finite amount')
accepted.append({'transaction_id': identifier,
'amount': str(amount)})
except (InvalidOperation, ValueError):
rejected.append({'line': line, 'reason': 'invalid fields'})
payload = ''.join(json.dumps(row) + '\n' for row in accepted)
Path('accepted.jsonl').write_text(payload, encoding='utf-8')
Path('rejected.json').write_text(json.dumps(rejected), encoding='utf-8')
print({'accepted': len(accepted), 'rejected': len(rejected)})
Jalankan berkas Python dari direktori latihan. Hasilnya dua baris diterima dan dua ditolak. Amount ditulis sebagai string agar serialisasi tidak mengubah desimal presisi menjadi floating point biner. Loader berikutnya harus mengubah string menjadi tipe numerik presisi tetap yang sesuai.
Pahami batas contoh
newline='' menyerahkan penanganan baris baru dalam kutipan kepada modul CSV. Tangkap hanya kegagalan kolom yang diharapkan; berkas hilang atau kegagalan izin harus menghentikan proses. Contoh menampung semua baris di memori dan menimpa keluaran, sehingga cocok untuk latihan kecil.
Untuk produksi, tambahkan identitas berkas, pemeriksaan jumlah kolom, kontrak mata uang dan skala, penyimpanan penolakan yang tahan gagal, serta publikasi atomik. Jangan tandai berkas yang baru tertulis sebagian sebagai batch lengkap. Deduplikasi identifier bisnis juga perlu langkah terpisah karena transformasi ini belum menjamin keunikan.