DuckDBとはどんなデータベースか
DuckDBは、アプリケーション内で動作するインプロセス型の分析用(OLAP)SQLデータベースだ。SQLiteがトランザクション処理(OLTP)に特化しているのに対し、DuckDBは分析クエリに最適化されている。列指向のベクトル化実行エンジンにより、大量データの集計や結合を高速に処理する。
サーバープロセスが不要で、pip install duckdb だけで使い始められる。
主な機能とデータ分析での強み
- サーバーレス・組み込み型:外部プロセス不要。Python、Node.js、Java、Rustなどから直接利用可能
- ファイル直接クエリ:Parquet、CSV、JSON、ExcelファイルをインポートせずにそのままSQL分析
- 列指向ベクトル化実行:OLAP特化の実行エンジンで、集計・結合クエリが高速
- フルSQL対応:Window関数、CTE、サブクエリ、PIVOT、LATERALなど標準SQL機能を網羅
- pandas連携:DataFrameをゼロコピーでSQLクエリ対象にでき、結果もDataFrameで受け取れる
- 拡張機能:空間データ(spatial)、HTTP経由のリモートファイル読み込み、PostgreSQLスキャナーなど
インストールとデータ分析の始め方
# Python
pip install duckdb
# CLI(macOS)
brew install duckdb
# Node.js
npm install duckdb
Pythonでの基本的な使い方:
import duckdb
# CSVファイルを直接クエリ
result = duckdb.sql("SELECT * FROM 'sales_data.csv' WHERE amount > 1000")
print(result)
# Parquetファイルの集計
duckdb.sql("""
SELECT category, SUM(amount) as total
FROM 'transactions.parquet'
GROUP BY category
ORDER BY total DESC
""")
pandasとの連携:
import pandas as pd
import duckdb
df = pd.read_csv("users.csv")
# DataFrameに直接SQLを実行
result = duckdb.sql("SELECT age, COUNT(*) FROM df GROUP BY age ORDER BY age")
result.df() # 結果をDataFrameに変換
CLIでの対話的クエリ:
duckdb
# S3上のParquetファイルを直接クエリ
SELECT * FROM read_parquet('s3://my-bucket/data/*.parquet') LIMIT 10;
競合データベースとの比較
| ツール | タイプ | 得意領域 | スケール | セットアップ |
|---|---|---|---|---|
| DuckDB | 組み込みOLAP | ローカル分析 | シングルノード | pip installのみ |
| SQLite | 組み込みOLTP | トランザクション | シングルノード | 標準装備 |
| ClickHouse | サーバーOLAP | 大規模分析 | 分散対応 | サーバー構築 |
| Polars | DataFrameライブラリ | メモリ内処理 | シングルノード | pip installのみ |
| Apache Spark SQL | 分散SQL | 大規模ETL | 分散クラスタ | クラスタ構築 |
差別化ポイント:DuckDBは「SQLiteの分析版」というポジションで、セットアップの手軽さと分析性能を両立している。ClickHouseは大規模分散処理に強いが、サーバー構築が必要。PolarsはDataFrame APIが中心で、SQLインターフェースではDuckDBが優位。
AI/MLワークフローでのDuckDB活用
LLMアプリケーションのログ分析やRAGのデータ前処理にDuckDBは有効だ。S3上のParquetファイルを直接クエリできるため、Apache AirflowのDAGからDuckDBを呼び出して軽量なETL処理を実行する構成が増えている。
dbtのアダプターとしてもDuckDBが利用でき、ローカルでのデータ変換テストに最適だ。
まとめ:DuckDBが向いているケース
DuckDBは「サーバーを立てずにローカルのファイルをSQLで分析したい」場面で最も力を発揮する。GB単位のCSVやParquetファイルの探索的分析、pandas DataFrameへのSQL実行、CI/CDでのデータ品質チェックなど、手軽さと速度が求められるシーンに最適だ。