$type=ticker$cols=4

$type=slider$meta=0$snip=0$rm=0

Membangun Pipeline CSV ke Parquet dengan Python dan DuckDB: Validasi dan Jejak Audit Lokal

Pipeline data tidak selalu membutuhkan klaster besar, layanan cloud, atau orkestrator yang kompleks. Untuk eksplorasi, pelaporan internal b...

Alur pipeline data lokal dari berkas CSV melalui DuckDB menjadi Parquet

Pipeline data tidak selalu membutuhkan klaster besar, layanan cloud, atau orkestrator yang kompleks. Untuk eksplorasi, pelaporan internal berskala wajar, dan prototipe, sebuah laptop dapat menjalankan alur yang jelas: membaca sumber lokal, memeriksa kualitasnya, mentransformasi data dengan SQL, lalu menyimpan hasil dalam format kolumnar. DuckDB dan Parquet merupakan kombinasi yang menarik untuk kebutuhan tersebut.

Namun, “lokal” tidak otomatis berarti aman atau reproducible. Berkas sumber dapat berubah tanpa pemberitahuan, versi perangkat lunak dapat berbeda, dan keluaran lama dapat tertukar dengan hasil yang baru. Artikel ini menunjukkan rancangan lab lokal sederhana, lengkap dengan pemeriksaan dan batasannya. Contohnya bersifat edukatif: sesuaikan lokasi penyimpanan, kebijakan akses, dan aturan kualitas dengan kondisi organisasi Anda.

Mengapa DuckDB dan Parquet?

DuckDB adalah mesin analitik yang dapat berjalan di dalam proses aplikasi. Kita dapat menggunakannya melalui Python dan menjalankan SQL tanpa menyiapkan server database terpisah. Parquet adalah format penyimpanan kolumnar yang cocok untuk banyak pekerjaan analitik karena data diatur per kolom dan mendukung kompresi. DuckDB dapat membaca dan menulis Parquet, sehingga tahap transformasi dan penyimpanan dapat dihubungkan dengan relatif sederhana.

Keuntungan utamanya dalam lab ini adalah sedikitnya komponen operasional, bukan jaminan bahwa setiap beban kerja akan lebih cepat. Performa bergantung pada bentuk data, media penyimpanan, memori, jenis kueri, dan pengaturan. Jangan menggeneralisasi hasil uji mesin lain untuk sistem produksi Anda. Dokumentasi resmi DuckDB dan Apache Parquet menyediakan penjelasan fitur dan detail format yang perlu diperiksa ketika versi berubah.

Menentukan batas contoh

Kita akan mengolah berkas transaksi sintetis yang berada di komputer lokal. Hasilnya adalah ringkasan penjualan per tanggal dan wilayah, bukan sistem pembayaran atau laporan keuangan resmi. Setiap baris sumber memiliki tanggal, wilayah, dan nilai penjualan. Contoh ini sengaja tidak memuat nama pelanggan, alamat, token, maupun data pribadi. Input nyata membutuhkan penilaian risiko tambahan sebelum dipindahkan ke laptop.

Menyiapkan ruang kerja yang terisolasi

Buat direktori khusus dan lingkungan Python terpisah. Perintah berikut mengasumsikan Python dan pip sudah tersedia. Nomor versi DuckDB dipasang secara eksplisit sebagai contoh; periksa kesesuaian versi dengan lingkungan Anda sebelum menjadikannya standar tim. Berkas sumber disimpan terpisah dari keluaran agar proses dapat diulang tanpa menimpa input.

mkdir -p lab-duckdb/{input,output}
cd lab-duckdb
python3 -m venv .venv
. .venv/bin/activate
python -m pip install 'duckdb==1.1.3'
python -m pip freeze > requirements-lock.txt
cat > input/transaksi.csv <<'CSV'
tanggal,wilayah,nilai
2026-11-01,Timur,120000
2026-11-01,Barat,80000
2026-11-02,Timur,50000
CSV

Berkas requirements-lock.txt merekam paket yang terpasang di lingkungan ini. Untuk percobaan ulang, gunakan versi Python yang sama dan pasang dependensi dari berkas tersebut pada lingkungan baru. Catatan versi saja belum menjamin identitas byte paket atau kesetaraan seluruh sistem operasi; lingkungan yang lebih ketat dapat menggunakan penguncian dengan hash dan repositori paket tepercaya.

Menata akses dan sumber

Batasi izin direktori sesuai pengguna sistem dan kebijakan organisasi. Jangan menyimpan file kredensial di dalam direktori input atau memasukkannya ke repositori. Jika menggunakan data sensitif, pertimbangkan enkripsi penyimpanan, pengendalian akses, retensi, serta prosedur penghapusan. Memindahkan data produksi ke perangkat pribadi tanpa izin bukan bagian dari lab ini.

Catatan keamanan: data contoh bersifat sintetis. Jalankan pipeline hanya pada sumber yang Anda berwenang gunakan, dan perlakukan keluaran maupun log sesuai klasifikasi data yang sebenarnya.

Menyusun pipeline dari CSV ke Parquet

Simpan skrip berikut sebagai pipeline.py di direktori lab. Skrip membaca CSV dengan tipe eksplisit, menolak baris yang melanggar aturan contoh, lalu menulis agregat ke berkas sementara sebelum mengganti keluaran akhir. Konversi tanggal dan angka yang gagal juga menghentikan proses, bukan diam-diam mengubah hasil. Jalankan dari direktori lab karena jalur relatif merujuk ke direktori kerja saat ini.

from pathlib import Path
import duckdb

source = Path('input/transaksi.csv')
target = Path('output/ringkasan.parquet')
tmp = target.with_suffix('.parquet.tmp')
target.parent.mkdir(parents=True, exist_ok=True)

if not source.is_file():
    raise FileNotFoundError(source)

con = duckdb.connect()
try:
    con.execute("""
        CREATE TEMP TABLE transaksi AS
        SELECT CAST(tanggal AS DATE) AS tanggal,
               trim(wilayah) AS wilayah,
               CAST(nilai AS BIGINT) AS nilai
        FROM read_csv('input/transaksi.csv',
            columns={'tanggal': 'VARCHAR',
                     'wilayah': 'VARCHAR', 'nilai': 'VARCHAR'},
            header=true)
    """)
    invalid = con.execute("""
        SELECT count(*) FROM transaksi
        WHERE tanggal IS NULL OR wilayah IS NULL
           OR wilayah = '' OR nilai IS NULL OR nilai < 0
    """).fetchone()[0]
    if invalid:
        raise ValueError(f'{invalid} baris tidak valid')
    con.execute("""
        COPY (
            SELECT tanggal, wilayah, sum(nilai) AS total_nilai,
                   count(*) AS jumlah_transaksi
            FROM transaksi GROUP BY tanggal, wilayah
            ORDER BY tanggal, wilayah
        ) TO 'output/ringkasan.parquet.tmp' (FORMAT PARQUET)
    """)
    tmp.replace(target)
finally:
    con.close()
    tmp.unlink(missing_ok=True)

Mengapa validasi dilakukan sebelum menulis?

Tipe eksplisit mengurangi ketergantungan pada inferensi skema, yang dapat berubah ketika isi contoh berbeda. Aturan nilai nonnegatif dan wilayah tidak kosong hanya ilustrasi: transaksi pengembalian atau wilayah yang memang tidak diketahui mungkin membutuhkan aturan lain. Input kosong juga dapat menghasilkan keluaran kosong; tambahkan ambang jumlah baris atau aturan rekonsiliasi bila bisnis membutuhkannya.

Penggantian berkas sementara menjaga keluaran sebelumnya ketika validasi atau penulisan gagal sebelum tahap penggantian. Tetapi ini bukan mekanisme transaksi lengkap untuk banyak berkas, bukan perlindungan dari dua proses yang berjalan bersamaan, dan bukan jaminan ketahanan terhadap semua kegagalan perangkat. Gunakan direktori output per eksekusi atau penguncian yang sesuai jika ada kemungkinan pekerjaan paralel.

Menjalankan dan memeriksa hasil

Jalankan skrip, kemudian baca kembali keluaran menggunakan proses Python terpisah. Pemeriksaan ini memastikan berkas dapat dibaca dan menampilkan isi agregat; dengan input contoh, total nilai seluruh transaksi adalah 250000. Nilai itu berasal dari tiga baris sintetis di atas, bukan hasil benchmark.

python pipeline.py
python - <<'PY'
import duckdb
con = duckdb.connect()
rows = con.execute("""
    SELECT tanggal, wilayah, total_nilai, jumlah_transaksi
    FROM read_parquet('output/ringkasan.parquet')
    ORDER BY tanggal, wilayah
""").fetchall()
for row in rows:
    print(row)
print('Total nilai:', sum(row[2] for row in rows))
print('Total transaksi:', sum(row[3] for row in rows))
con.close()
PY

Bedakan pemeriksaan contoh dan jaminan kualitas

Melihat baris dan menjumlahkannya adalah pemeriksaan awal, bukan pengujian menyeluruh. Untuk pemakaian rutin, tambahkan pengujian otomatis untuk input kosong, nilai negatif, tanggal tidak valid, kolom hilang, duplikasi, dan volume besar. Putuskan juga apakah duplikasi benar-benar kesalahan: dua transaksi sah dapat memiliki tanggal, wilayah, dan nilai yang sama. Identitas transaksi atau aturan sumber diperlukan sebelum melakukan deduplikasi.

Periksa jumlah baris dan total dari sumber terhadap hasil menurut aturan yang disepakati. Jika ada baris yang ditolak, simpan hanya informasi diagnostik yang diperlukan dan hindari mencetak isi sensitif ke log. Kegagalan validasi sebaiknya menghentikan alur dengan pesan jelas agar hasil lama tidak disalahartikan sebagai keluaran terbaru.

Membuat eksekusi dapat ditelusuri dan diulang

Reproducibility memerlukan lebih dari menyimpan skrip. Catat versi Python dan DuckDB, isi konfigurasi nonrahasia, versi kode, waktu eksekusi, serta identitas berkas input dan output. Hash membantu mendeteksi perubahan byte, meskipun tidak membuktikan asal data atau menjamin bahwa isinya benar. Simpan catatan ini bersama hasil di lokasi yang memiliki kontrol akses setara.

python --version
python -c "import duckdb; print('DuckDB', duckdb.__version__)"
sha256sum input/transaksi.csv output/ringkasan.parquet
python -m pip freeze

Untuk mengulang eksperimen, buat lingkungan bersih dengan versi Python yang dicatat, pasang dependensi yang sama, kembalikan input yang hash-nya sesuai, lalu jalankan skrip yang sama. Bandingkan isi dan skema keluaran selain hash. Identitas byte Parquet dapat berbeda akibat versi penulis atau metadata meskipun nilai logisnya setara, sehingga definisikan kriteria kesetaraan sebelum membandingkan.

Jika input dapat berubah selama pembacaan, hash sebelum atau sesudah eksekusi saja tidak memastikan apa yang dibaca mesin. Gunakan salinan input yang tidak berubah selama proses, misalnya snapshot yang dikelola sesuai kebijakan penyimpanan. Untuk audit lebih kuat, gunakan manifest input, versi kode, dan identitas eksekusi; jangan mengandalkan nama berkas seperti final.csv sebagai bukti versi.

Jangan lupa mencatat konteks perubahan aturan. Jika definisi wilayah berubah atau nilai transaksi mulai menyertakan pajak, dua keluaran dari tanggal berbeda mungkin tidak dapat dibandingkan begitu saja. Beri versi pada definisi transformasi dan simpan penjelasan singkat mengenai perubahan yang memengaruhi interpretasi angka. Bila diperlukan, buat ulang keluaran historis dengan input yang sama dan aturan baru sebagai pekerjaan terpisah, bukan menimpa bukti lama tanpa catatan.

Saat berbagi hasil, sertakan metadata yang membantu pembaca memahami cakupan: periode data, sumber yang diizinkan untuk disebut, waktu pemrosesan, satuan, dan pemeriksaan kualitas yang telah dijalankan. Hindari mencantumkan informasi pribadi pada nama berkas, pesan kesalahan, atau manifest. Apabila laporan akan dipakai untuk keputusan penting, tinjau pula kesesuaian definisi dengan pemilik data dan lakukan rekonsiliasi yang relevan. Langkah sederhana ini membantu membedakan hasil eksperimen dari laporan yang sudah disetujui untuk penggunaan operasional.

Dari lab ke penggunaan tim

Untuk kolaborasi, dokumentasikan kontrak skema: nama dan tipe kolom, satuan nilai, zona waktu bila ada timestamp, aturan null, dan definisi agregasi. Pisahkan kode, input, output, serta konfigurasi. Data mentah biasanya tidak perlu dikomit ke repositori kode; gunakan lokasi yang disetujui dan mekanisme akses yang sesuai. Contoh sintetis kecil dapat disimpan bersama tes bila kebijakan mengizinkan.

Ketika data bertambah, pertimbangkan partisi Parquet berdasarkan pola kueri yang nyata, bukan berdasarkan asumsi. Terlalu banyak partisi kecil dapat menambah beban pengelolaan berkas. Ukur waktu, penggunaan memori, dan ukuran penyimpanan pada data perwakilan dengan prosedur yang terdokumentasi. Batas memori, kapasitas disk, serta kegagalan saat ruang habis juga perlu diuji sebelum pipeline digunakan secara terjadwal.

Hal yang belum diuji dalam contoh

Contoh ini merupakan rancangan lab dan tidak menyatakan telah diuji pada sistem Anda. Belum ada pengukuran performa, pengujian data produksi, kompatibilitas lintas platform, pemulihan setelah listrik mati, akses bersamaan, maupun audit keamanan. Tidak ada mekanisme penjadwalan, retry, pemantauan, atau pengelolaan rahasia yang disediakan. Sebelum operasional, uji kebutuhan tersebut secara terpisah dan tetapkan siapa yang bertanggung jawab ketika pekerjaan gagal.

DuckDB dan Parquet dapat menjadi fondasi yang praktis untuk pipeline lokal: sumber dipisahkan dari keluaran, transformasi ditulis sebagai SQL, kualitas diperiksa sebelum penulisan, dan identitas data dicatat. Nilai utamanya bukan sekadar menjalankan kueri di laptop, melainkan membuat proses yang dapat dijelaskan, diperiksa, dan diulang dengan batas keamanan yang jelas.

COMMENTS

Name

1clickInstall,1,404,1,Access Management,1,Analytics Engineering,1,android,1,Ansible,1,Apache Airflow,1,Apache Flink,1,Apache Iceberg,1,Apache Kafka,1,Apache Parquet,1,Apache2,1,API Telegram,1,Apple,3,Automation,1,AWS,1,Backup,2,bapak internet indonesia,1,Big Data,7,blkid,1,booting,1,BorgBackup,1,brainware,1,calc,1,can't mount,3,can't read superblock,1,cara mengatasi disk failure,1,cara mengatasi disk penuh,1,cara mengatasi error disk,1,cara mengatasi error proxmox,1,cara mengatasi log full,1,centOS,1,Ceph,1,certificate,1,Chrome,1,Cilium,1,cinta sang penguasa,1,CLI,1,ClickHouse,1,Cloud,4,Cloud Computing,10,Cloud Native,1,Cloud Storage,6,Clustering,1,Codec,1,CodeIgniter,2,computare,4,computer,4,Container,1,Cybersecurity,13,dakwah,16,Data Engineering,11,Data Lineage,1,Data Mining,5,Data Quality,3,dbt,1,dd,1,Debezium,1,Debian,2,Deepin Linux,1,DevOps,8,DevSecOps,1,digital,1,Docker,13,dosa,1,dosa besar,1,DuckDB,3,eBPF,1,Enkripsi,1,era digital,1,error certificate,1,error path,1,error subscription,1,excel,1,failed subscription,1,Fedora,1,fedora26,1,Feeder,1,Firewall,1,FP-Growth,1,fstab,1,ftp server,1,fujitsu,1,gambar,1,ghibah,1,Git,2,GitHub,2,gitignore,1,gitignore not work,1,Google,2,Google Chrome,1,Google Cloud,1,Google Drive,2,google-drive-ocamlfuse,1,Harbor,1,Harddisk,1,Hardware,1,Hashing,1,HCI,1,HDD,2,history,1,Homelab,1,host,1,Hostname,1,how to,2,IaC,1,IAM,1,igmp proxy,1,Ilmu Komputer,1,impress,1,indihome,1,INDUKSI MATEMATIKA,1,instalasi,3,install,10,install GIT,1,install linux,6,internet,2,islam,17,javascript,1,K-Means,1,K3s,1,Kafka,1,KDE Plasma,1,keamanan,1,Keamanan Cloud,2,keamanan data,1,Keamanan Jaringan,1,keynote,1,kodi,1,komputer,5,Kubernetes,3,kuliah,1,Lakehouse,1,Latte-dock,1,leap,7,leap 42.3,1,LibreOffice,1,Linux,65,linux ringan,3,Linux Server,2,Machine Learning,3,machintos,4,macOS,5,mageia,1,mandriva,1,Market Basket Analysis,1,mate,1,microsoft office,2,microsoft windows,4,microsoft word,1,Mikrotik,3,mint,1,mlxtend,1,Monitoring,1,mount,4,mounting,1,Multimedia Codec,1,Netwatch,1,network,1,network security,1,Networking,11,Nextcloud,1,Nginx,1,node js,1,NTFS,3,ntfsfix,2,numbers,1,Observability,1,office,5,OLAP,1,Online Account,1,onno,1,onnowpurbo,1,Open Source,3,OpenLineage,1,OpenMandriva,1,OpenOffice,2,openoffice calc,1,openoffice writer,1,openSUSE,11,operating system,1,OPNsense,1,ownCloud,1,ownCloud Client,1,PAGES,1,Pandas,2,Pandera,1,Parquet,1,PDDikti,1,pemikir islam,1,pengguna,1,perangkat keras,1,Perangkat Lunak,2,PHP,1,PHP 5,1,PKI,1,Polars,1,port 80,1,port 8082,1,postel sevice award,1,PostgreSQL,1,Powerpoint,1,presentasi,1,presentation,1,Privacy,1,Proxmox,16,PVE,1,Python,6,q4os,1,Redpanda,1,remaja islam,2,review,7,rezeki,1,s1300i,1,scanner,1,scansnap,1,Security,12,sejarah,1,Server,24,setting,1,Sistem Operasi,2,Software,2,spreadsheet,1,SQL,1,SSH,2,SSO,1,stb,1,Storage,8,Stream Processing,1,sukses dunia akhirat,1,Sysadmin,18,systemd,1,Tailscale,1,Telegram,1,Teleport,1,telkom,1,tesseract,1,text,1,Trino,1,Tutorial,31,tv box,1,Ubuntu,3,Unsupervised Learning,1,usb drive,1,useetv,1,user,1,VBA,1,version control,1,virtual machine,2,Virtualization,4,Visual basic,1,Visual Basic for Applications,1,VLC,2,VLC Media Player,1,VPN,1,vsftpd,1,Wazuh,1,whatsapp api,1,winbox,1,Windows,7,Windows 7,1,word,1,WORD PROCESSOR,2,workstation,1,WPS Office,1,Zero Trust,1,zypper,1,
ltr
item
zhato TECH: Membangun Pipeline CSV ke Parquet dengan Python dan DuckDB: Validasi dan Jejak Audit Lokal
Membangun Pipeline CSV ke Parquet dengan Python dan DuckDB: Validasi dan Jejak Audit Lokal
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHs5Mum5WR5460JASi_1X_AoyF_qsB_AJKhsQ-6kmbTR_sXmG5a7trA1B-HAe7KEU2CeDtq6W7N_tL3TEDEgSJ3uoJoeC6Q2tXhEt6iggB3fGpdwBNcqR0khCBdhXzkKLC_UbTSeTVrlTCtO6FB865msm28Ctt-tmaxstQ-wewDy8Ij8YsaeM2iXgtmM/s1600/image.webp
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHs5Mum5WR5460JASi_1X_AoyF_qsB_AJKhsQ-6kmbTR_sXmG5a7trA1B-HAe7KEU2CeDtq6W7N_tL3TEDEgSJ3uoJoeC6Q2tXhEt6iggB3fGpdwBNcqR0khCBdhXzkKLC_UbTSeTVrlTCtO6FB865msm28Ctt-tmaxstQ-wewDy8Ij8YsaeM2iXgtmM/s72-c/image.webp
zhato TECH
http://www.zhato-tech.id/2026/11/membangun-pipeline-csv-ke-parquet.html
http://www.zhato-tech.id/
http://www.zhato-tech.id/
http://www.zhato-tech.id/2026/11/membangun-pipeline-csv-ke-parquet.html
true
740282316614930842
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content