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:

AspekCSV (row-oriented)Parquet (column-oriented)
Susunan dataSatu baris menyusul satu barisSatu kolom menyusul satu kolom
Tipe dataTeks tanpa metadata, ditebak saat dibacaTersimpan eksplisit per kolom
KompresiTidak ada atau manualKompresi otomatis per kolom, misalnya snappy
Membaca sebagian kolomSeluruh file harus diuraiHanya blok kolom yang diminta
Ukuran fileBesarJauh 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:

python
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:

text
   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       8

Mari kita bedah tahap demi tahap:

  1. Baris 10 (penjualan.to_parquet("penjualan.parquet", engine="pyarrow", index=False)): DataFrame ditulis sebagai file Parquet dengan engine pyarrow; parameter index=False membuat RangeIndex tidak disimpan, sehingga pandas membuat ulang index 0, 1, 2, 3 saat membaca.
  2. Baris 12-15 (df = pd.read_parquet(...)): file dibaca menjadi DataFrame baru; dtypes menunjukkan tipe data tersimpan utuh: kolom produk langsung str dan kolom angka langsung int64 tanpa tebakan ulang.
  3. Baris 17 (df.equals(penjualan)): hasil True menegaskan simpan-baca mengembalikan nilai dan tipe data identik; berbeda dari CSV yang menebak tipe tiap pembacaan.
  4. Baris 19-20 (pd.read_parquet(..., columns=["produk", "jumlah"])): parameter columns meminta 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:

python
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:

text
Jumlah baris       : 12000
Ukuran file CSV    : 318323 byte
Ukuran file Parquet: 72860 byte
Rasio CSV/Parquet  : 4.4

Dua 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.