DuckDB adalah salah satu tools yang sangat powerfull untuk memproses data OLAP (Online Analytical Processing), baik dalam bentuk CSV ataupun parquet. Dengan bantuan DuckDB kita bisa menggunakan SQL query untuk melihat data yang terdapat pada CSV.
Dibandingkan dengan menggunakan database konvensional OLTP (Online Transaction Processing), seperti PostgreSQL, MySQL, ataupun SQL Server, database OLAP sangat disarankan untuk analisis data. Contoh yang bisa dilakukan adalah dengan mengeksport data harian ke file CSV, database yang disebutkan diatas sudah mensupport by default. Bila menggunakan Microsoft SQL Server gunakan BCP
Pada contoh disini, saya akan menggunakan 5,5 GB file csv, dengan total 50 juta baris (50.000.000 baris).
ls -l -rw-r--r-- 1 tommy tommy 5888521411 Jun 24 21:17 /home/tommy/git/duckdb/data/customers.csv ls -lah -rw-r--r-- 1 tommy tommy 5.5G Jun 24 21:17 /home/tommy/git/duckdb/data/customers.csv
Spesifikasi komputer
Memory 16 GB
Storage 1 TB (SSD)
CPU Ryzen 7 5800U
OS Fedora 44
Install DuckDB
Cara install atau upgrade DuckDB, cukup mudah karena DuckDB hanya terdiri dari satu binary. Untuk Linux/MacOS bisa mengikuti cara berikut
# Linux wget https://install.duckdb.org/v1.5.4/duckdb_cli-linux-amd64.zip # MacOS wget https://install.duckdb.org/v1.5.4/duckdb_cli-osx-universal.zip # Windows https://install.duckdb.org/v1.5.4/duckdb_cli-windows-amd64.zip
unzip the zip file
unzip duckdb_cli-linux-amd64.zippindah file tersebut ke $PATH, agar bisa dijalankan darimana saja
sudo mv duckdb /usr/local/bin/
Buka file CSV dengan DuckDB/Query CSV dengan Duckdb
Untuk menjalankan DuckDB, cukup dengan memanggil binary duckdb.
duckdb SELECT * FROM read_csv_auto("/home/tommy/git/duckdb/data/customers.csv");
Check total baris
SELECT COUNT(*) FROM read_csv_auto("/home/tommy/git/duckdb/data/customers.csv"); # output ┌─────────────────┐ │ count_star() │ │ int64 │ ├─────────────────┤ │ 50000000 │ │ (50.00 million) │ ├─────────────────┤
Query yang digunakan tidak hanya yang sederhana, contoh yang lebih kompleks, kita akan membuat kategori berdasarkan penghasilan tahunan customer
SELECT
CASE
WHEN annual_income < 100000000 THEN 'Low (< 100 Juta)'
WHEN annual_income BETWEEN 100000000 AND 500000000 THEN 'Medium (100 Juta - 500 Juta)'
ELSE 'High (> 500 Juta)'
END AS income_category,
COUNT(*) AS customer_count,
AVG(annual_income) AS average_income
FROM
read_csv_auto("/home/tommy/git/duckdb/data/customers.csv")
GROUP BY
CASE
WHEN annual_income < 100000000 THEN 'Low (< 100 Juta)'
WHEN annual_income BETWEEN 100000000 AND 500000000 THEN 'Medium (100 Juta - 500 Juta)'
ELSE 'High (> 500 Juta)'
END
ORDER BY
customer_count DESC;hasilnya hanya data bisa ditampilkan kurang dari 2 detik
┌──────────────────────────────┬────────────────┬────────────────────┐ │ income_category │ customer_count │ average_income │ │ varchar │ int64 │ double │ ├──────────────────────────────┼────────────────┼────────────────────┤ │ High (> 500 Juta) │ 27773861 │ 749978924.3363277 │ │ Medium (100 Juta - 500 Juta) │ 22226139 │ 299979979.40234405 │ └──────────────────────────────┴────────────────┴────────────────────┘ Run Time (s): real 1.479 user 11.600134 sys 1.169810
Convert CSV ke Parquet
Dibandingkan dengan CSV yang menggunakan baris, format file parquet yang menggunakan kolom, memberikan efesiensi penyimpanan yang jauh lebih besar.
Convert CSV ke Parquet
# kurang lebih 13 detik COPY (SELECT * FROM read_csv_auto("/home/tommy/git/duckdb/data/customers.csv")) TO '/home/tommy/git/duckdb/data/customers.parquet' (FORMAT parquet);
Untuk memperkecil file Parquet, gunakan ZSTD
# kurang lebih 10 detik COPY (SELECT * FROM read_csv_auto("/home/tommy/git/duckdb/data/customers.csv")) TO '/home/tommy/git/duckdb/data/customers-zstd.parquet' (FORMAT parquet, COMPRESSION ZSTD);
dengan menambahkan zstd ukuran jauh lebih kecil yang cocok untuk menghemat penyimpanan
-rw-r--r-- 1 tommy tommy 5.5G Jun 24 21:17 customers.csv -rw-r--r-- 1 tommy tommy 2.0G Jun 27 17:50 customers.parquet -rw-r--r-- 1 tommy tommy 1.1G Jun 27 17:50 customers-zstd.parquet
