Artikel

Konten contoh

Membangun Pipeline ETL dengan Python

Baca CSV kecil, tolak amount yang tidak valid secara jelas, lalu tulis hasil JSON Lines yang dapat diulang.

Penulis: alfianh.id (identitas pratinjau)Pemula2 menit bacaTerbit:

Konten, data, dan tanggal ini merupakan contoh untuk pratinjau situs.

English

Ikuti artikel melalui RSS

Ukuran teks bacaan18px

Buka simpanan / perbaiki data

Simpanan dan ukuran teks hanya untuk browser ini. Tidak ada sinkronisasi antarperangkat.

Input CSV divalidasi dan amount diubah menjadi desimal sebelum ditulis sebagai JSON Lines
Input CSV divalidasi dan amount diubah menjadi desimal sebelum ditulis sebagai JSON Lines
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.

Referensi