DuckDB: Database Analitik In-Process untuk Data Science
DuckDB adalah database analitik in-process yang dirancang khusus untuk workload OLAP (Online Analytical Processing). Berbeda dengan database tradisional seperti PostgreSQL atau MySQL yang memerlukan server terpisah, DuckDB berjalan langsung di dalam proses aplikasi Anda, mirip seperti SQLite tetapi dioptimalkan untuk analitik. Dalam tutorial ini, kita akan mempelajari cara menggunakan DuckDB untuk workflow data science yang efisien dan powerful.
Mengapa DuckDB?
Sebelum membahas teknis, mari pahami mengapa DuckDB menjadi pilihan populer di kalangan data scientist:
- Tanpa server: Tidak perlu instalasi database server, konfigurasi, atau manajemen
- Columnar storage: Data disimpan per kolom, optimal untuk query analitik
- Vectorized execution: Memproses data dalam batch untuk performa maksimal
- Query file langsung: Bisa query CSV, Parquet, dan JSON tanpa import terlebih dahulu
- Integrasi Python: API Python yang seamless dengan Pandas dan Polars
- SQL standar: Mendukung SQL yang kaya fitur termasuk window functions dan CTE
Instalasi
Instalasi DuckDB sangat mudah. Cukup gunakan pip:
pip install duckdb
Untuk verifikasi instalasi:
import duckdb
print(duckdb.version)
Jika Anda ingin menggunakan CLI DuckDB, bisa download binary dari website resmi atau gunakan:
pip install duckdb[cli]
Memulai dengan DuckDB
In-Memory Database
Cara paling sederhana untuk memulai adalah dengan in-memory database:
import duckdb
Membuat koneksi in-memory
con = duckdb.connect()
Atau secara eksplisit
con = duckdb.connect(database=':memory:')
Menjalankan query sederhana
result = con.sql("SELECT 42 AS jawaban, 'Halo DuckDB' AS pesan")
print(result.fetchall())
[(42, 'Halo DuckDB')]
Persistent Database
Untuk menyimpan data secara permanen, berikan nama file:
import duckdb
Membuat atau membuka database persisten
con = duckdb.connect('analitik.duckdb')
Membuat tabel
con.sql("""
CREATE TABLE IF NOT EXISTS penjualan (
id INTEGER PRIMARY KEY,
produk VARCHAR,
kategori VARCHAR,
jumlah INTEGER,
harga DECIMAL(10, 2),
tanggal DATE
)
""")
Insert data
con.sql("""
INSERT INTO penjualan VALUES
(1, 'Laptop Pro', 'Elektronik', 5, 15000000, '2026-01-15'),
(2, 'Mouse Wireless', 'Aksesoris', 50, 250000, '2026-01-16'),
(3, 'Keyboard Mekanik', 'Aksesoris', 30, 750000, '2026-01-16'),
(4, 'Monitor 27 inch', 'Elektronik', 10, 4500000, '2026-01-17'),
(5, 'Headset Gaming', 'Aksesoris', 25, 500000, '2026-01-18')
""")
Query data
result = con.sql("SELECT FROM penjualan WHERE kategori = 'Elektronik'")
result.show()
Query File Langsung Tanpa Import
Salah satu fitur paling powerful dari DuckDB adalah kemampuan query file langsung.
Query CSV
import duckdb
Query CSV langsung
result = duckdb.sql("""
SELECT
FROM readcsvauto('data/transaksi.csv')
WHERE total > 1000000
ORDER BY tanggal DESC
LIMIT 10
""")
result.show()
Dengan opsi spesifik
result = duckdb.sql("""
SELECT
FROM readcsv('data/transaksi.csv',
delim=',',
header=true,
dateformat='%Y-%m-%d'
)
""")
Query Parquet
Parquet adalah format file kolumnar yang sangat efisien. DuckDB membacanya secara native:
import duckdb
Query file Parquet
result = duckdb.sql("""
SELECT
kategori,
COUNT() AS jumlahtransaksi,
SUM(total) AS totalpendapatan,
AVG(total) AS ratarata
FROM readparquet('data/transaksi2026.parquet')
GROUP BY kategori
ORDER BY totalpendapatan DESC
""")
result.show()
Query multiple file Parquet dengan glob pattern
result = duckdb.sql("""
SELECT
FROM readparquet('data/transaksi.parquet')