Format CSV, Excel, dan JSON yang kita pelajari menyimpan data baris demi baris; susunan itu mudah dibaca manusia tetapi boros ruang dan lambat ketika data mencapai jutaan baris. Parquet menyusun data secara berbeda: setiap kolom disimpan berdekatan, dikompresi sendiri-sendiri, dan disertai metadata statistik, sehingga membaca satu kolom dari tabel raksasa tidak perlu menyentuh kolom lain. Format ini menjadi standar penyimpanan data engineering, dan pandas membacanya melalui pustaka pyarrow yang sudah terpasang di lingkungan kita. Pada Chapter ini kita menyimpan DataFrame pertama ke Parquet, membacanya kembali, lalu mengukur sendiri efisiensinya dibanding CSV.
Layout Baris vs Layout Kolom #
Perbedaan mendasar antara CSV dan Parquet terletak pada susunan byte di dalam file:
| Aspek | CSV (row-oriented) | Parquet (column-oriented) |
|---|---|---|
| Susunan data | Satu baris menyusul satu baris | Satu kolom menyusul satu kolom |
| Tipe data | Teks tanpa metadata, ditebak saat dibaca | Tersimpan eksplisit per kolom |
| Kompresi | Tidak ada atau manual | Kompresi otomatis per kolom, misalnya snappy |
| Membaca sebagian kolom | Seluruh file harus diurai | Hanya blok kolom yang diminta |
| Ukuran file | Besar | Jauh lebih kecil untuk data analitik |
Dalam layout kolom, nilai sejenis menumpuk berdekatan sehingga kompresi bekerja efektif; kolom produk yang berulang disimpan sebagai kamus kecil, bukan ribuan salinan teks. Metadata statistik per blok membuat mesin pembaca dapat melewati blok yang tak relevan dengan filter kita. Dua sifat inilah yang membuat Parquet unggul pada data besar.
Menyimpan dan Membaca Parquet #
Pasangan methodnya simetris dengan format sebelumnya: to_parquet() untuk menulis dan read_parquet() untuk membaca. Skrip berikut menyimpan tabel penjualan, membacanya kembali, membandingkannya dengan DataFrame asal, lalu membaca ulang dua kolom tertentu:
import pandas as pd
from pathlib import Path
penjualan = pd.DataFrame({
"transaksi": [1, 2, 3, 4],
"produk": ["Kopi Gayo", "Teh Melati", "Gula Aren", "Kopi Gayo"],
"jumlah": [12, 30, 25, 8],
"harga": [85000, 32000, 24000, 85000],
})
penjualan.to_parquet("penjualan.parquet", engine="pyarrow", index=False)
df = pd.read_parquet("penjualan.parquet", engine="pyarrow")
print(df)
print()
print(df.dtypes)
print()
print(df.equals(penjualan))
print()
sebagian = pd.read_parquet("penjualan.parquet", engine="pyarrow", columns=["produk", "jumlah"])
print(sebagian)
Path("penjualan.parquet").unlink()Output yang Dihasilkan:
transaksi produk jumlah harga
0 1 Kopi Gayo 12 85000
1 2 Teh Melati 30 32000
2 3 Gula Aren 25 24000
3 4 Kopi Gayo 8 85000
transaksi int64
produk str
jumlah int64
harga int64
dtype: object
True
produk jumlah
0 Kopi Gayo 12
1 Teh Melati 30
2 Gula Aren 25
3 Kopi Gayo 8Mari kita bedah tahap demi tahap:
- Baris 10 (
penjualan.to_parquet("penjualan.parquet", engine="pyarrow", index=False)): DataFrame ditulis sebagai file Parquet dengan enginepyarrow; parameterindex=Falsemembuat RangeIndex tidak disimpan, sehingga pandas membuat ulang index0, 1, 2, 3saat membaca. - Baris 12-15 (
df = pd.read_parquet(...)): file dibaca menjadi DataFrame baru;dtypesmenunjukkan tipe data tersimpan utuh: kolomproduklangsungstrdan kolom angka langsungint64tanpa tebakan ulang. - Baris 17 (
df.equals(penjualan)): hasilTruemenegaskan simpan-baca mengembalikan nilai dan tipe data identik; berbeda dari CSV yang menebak tipe tiap pembacaan. - Baris 19-20 (
pd.read_parquet(..., columns=["produk", "jumlah"])): parametercolumnsmeminta dua kolom saja; pyarrow hanya membaca blok kolom tersebut.
Membaca Sebagian Kolom Saja #
Parameter columns pada contoh di atas adalah salah satu alasan utama Parquet dipakai di sistem data besar. Karena setiap kolom disimpan sebagai blok terpisah, membaca dua kolom dari tabel sepuluh kolom hanya mengunduh dua blok; pada CSV, seluruh file tetap harus diurai. Pola ini disebut column pruning. Untuk data yang terpartisi, parameter filters memanfaatkan statistik blok sehingga baris yang tak relevan tidak dibaca sama sekali; keduanya didokumentasikan pada halaman read_parquet
.
Seberapa Efisien Parquet #
Skrip berikut membuat 12.000 baris data penjualan yang polanya berulang, lalu menyimpan tabel yang sama dalam dua format dan membandingkan ukuran filenya:
import pandas as pd
from pathlib import Path
n = 12000
produk = ["Kopi Gayo", "Teh Melati", "Gula Aren", "Kopi Robusta"]
kota = ["Bandung", "Jakarta", "Surabaya", "Medan"]
penjualan = pd.DataFrame({
"transaksi": range(1, n + 1),
"produk": [produk[i % 4] for i in range(n)],
"kota": [kota[i % 4] for i in range(n)],
"jumlah": [(i % 30) + 1 for i in range(n)],
})
penjualan.to_csv("penjualan_besar.csv", index=False)
penjualan.to_parquet("penjualan_besar.parquet", engine="pyarrow", index=False)
ukuran_csv = Path("penjualan_besar.csv").stat().st_size
ukuran_parquet = Path("penjualan_besar.parquet").stat().st_size
print("Jumlah baris :", len(penjualan))
print("Ukuran file CSV :", ukuran_csv, "byte")
print("Ukuran file Parquet:", ukuran_parquet, "byte")
print("Rasio CSV/Parquet :", round(ukuran_csv / ukuran_parquet, 1))
Path("penjualan_besar.csv").unlink()
Path("penjualan_besar.parquet").unlink()Output yang Dihasilkan:
Jumlah baris : 12000
Ukuran file CSV : 318323 byte
Ukuran file Parquet: 72860 byte
Rasio CSV/Parquet : 4.4Dua file menyimpan tabel yang identik, tetapi Parquet hanya membutuhkan sekitar seperempat ukuran CSV. Kemenangan ini berasal dari kompresi snappy yang aktif secara default dan pengodean kamus (dictionary encoding) untuk kolom berulang seperti produk dan kota. Parameter compression pada to_parquet() bisa diatur ke "gzip" atau "zstd" bila ukuran file lebih penting daripada kecepatan baca. Rangkuman format baca-tulis lainnya ada pada halaman IO tools
, sedangkan opsi Parquet dijelaskan pada dokumentasi to_parquet
.
Posisi Parquet dalam Alur Kerja #
Kita kini punya format yang menyimpan tipe data secara utuh, hemat ruang, dan mendukung pembacaan sebagian kolom. Format ini cocok untuk penyimpanan menengah dan panjang: hasil pembersihan harian dan dataset pelatihan. Untuk pertukaran data berkecepatan tinggi antara pandas dan alat berbasis Arrow, Chapter berikutnya membahas Feather, saudara Parquet yang dirancang khusus untuk kecepatan.