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

pindah 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");

data customers dummy

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)27773861749978924.3363277 │
│ Medium (100 Juta - 500 Juta)22226139299979979.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.

perbedaan format kolom dan baris
perbedaan format kolom dan baris

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

Leave a comment

Your email address will not be published. Required fields are marked *