これは、なにをしたくて書いたもの?
前々からちょっと気になっていた、DuckDBを少し使ってみようと思いまして。
今回はUbuntu Linux 24.04 LTSにインストールしてみます。
DuckDB
DuckDBのWebサイトはこちら。
DuckDB – An in-process SQL OLAP database management system
GitHub - duckdb/duckdb: DuckDB is an analytical in-process SQL database management system
DuckDBとはなにか?ですが、ドキュメントを見ても説明そのものは書かれていない気がしますね…。
GitHubにはあったので、引用します。
DuckDBは高性能な分析データベースシステムです。高速、信頼性、移植性、そして使いやすさを重視して設計されています。多数の機能の
サポートや拡張機能もあるようです。
DuckDB is a high-performance analytical database system. It is designed to be fast, reliable, portable, and easy to use. DuckDB provides a rich SQL dialect with support far beyond basic SQL. DuckDB supports arbitrary and nested correlated subqueries, window functions, collations, complex types (arrays, structs, maps), and several extensions designed to make SQL easier to use.
GitHub - duckdb/duckdb at v1.4.1
スタンドアロンで動作するCLIアプリケーション、Python、R、Java、Wasmなどのクライアントもあり、pandasなどとも統合可能です。
DuckDB is available as a standalone CLI application and has clients for Python, R, Java, Wasm, etc., with deep integrations with packages such as pandas and dplyr.
なぜDuckDBなのか?というページは読んでおくとよさそうです。
特徴はこちら。
- シンプル
- 外部依存関係なし
- サーバーソフトウェアではなく、ホスト側に組み込まれて動作するアプリケーション
- ポータブル
- 主要なOSで実行可能
- リソースの限られた環境から、100コア以上のCPUやテラバイトのメモリーを持つ環境でも導入可能
- 機能が豊富
- 高速
- 拡張機能
- 無料で利用可能
- MITライセンス
ドキュメントはこちら。
ひとまず使ってみて、どういうものなのか感覚を掴んでいってみましょうか。
環境
今回の環境はこちら。Ubuntu Linux 24.04 LTSです。
$ uname -srvmpio Linux 6.8.0-85-generic #85-Ubuntu SMP PREEMPT_DYNAMIC Thu Sep 18 15:26:59 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux vagrant@server:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.3 LTS Release: 24.04 Codename: noble $ uname -srvmpio Linux 6.8.0-85-generic #85-Ubuntu SMP PREEMPT_DYNAMIC Thu Sep 18 15:26:59 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
DuckDBをインストールする
LinuxでのDuckDBのインストール方法はこちら。今回はCLIを対象としていますが、各種プログラミング言語向けの話は今回は置いておきます。
DuckDB Installation(platofrmはLinux、環境はCLI)
インストール方法は3種類あり、curlとsh、Dockerイメージ、バイナリーになります。
curlとshでインストールしてみます。
$ curl https://install.duckdb.org | sh
でも、よく見るとバイナリーをダウンロードしてきてインストールしているのと同じみたいですね。
https://install.duckdb.org/v1.4.1/duckdb_cli-linux-amd64.gz
*** DuckDB Linux/MacOS installation script, version 1.4.1 ***
.;odxdl,
.xXXXXXXXXKc
0XXXXXXXXXXXd cooo:
,XXXXXXXXXXXXK OXXXXd
0XXXXXXXXXXXo cooo:
.xXXXXXXXXKc
.;odxdl,
######################################################################## 100.0%
Successfully installed DuckDB binary to /home/user/.duckdb/cli/1.4.1/duckdb
with a link from /home/user/.duckdb/cli/latest/duckdb
Hint: Append the following line to your shell profile:
export PATH='/home/user/.duckdb/cli/latest':$PATH
To launch DuckDB now, type
/home/user/.duckdb/cli/latest/duckdb
ひとまず以下を.bashrcに追記して、シェルを再度起動。
export PATH='/home/user/.duckdb/cli/latest':$PATH
インストールされましたね。
$ duckdb --version v1.4.1 (Andium) b390a7c376
オプションを見てみましょう。
$ duckdb --help Usage: duckdb [OPTIONS] FILENAME [SQL] FILENAME is the name of a DuckDB database. A new database is created if the file does not previously exist. OPTIONS include: -ascii set output mode to 'ascii' -bail stop after hitting an error -batch force batch I/O -box set output mode to 'box' -column set output mode to 'column' -cmd COMMAND run "COMMAND" before reading stdin -c COMMAND run "COMMAND" and exit -csv set output mode to 'csv' -echo print commands before execution -f FILENAME read/process named file and exit -init FILENAME read/process named file -[no]header turn headers on or off -help show this message -html set output mode to HTML -interactive force interactive I/O -json set output mode to 'json' -line set output mode to 'line' -list set output mode to 'list' -markdown set output mode to 'markdown' -newline SEP set output row separator. Default: '\n' -no-stdin exit after processing options instead of reading stdin -nullvalue TEXT set text string for NULL values. Default 'NULL' -quote set output mode to 'quote' -readonly open the database read-only -s COMMAND run "COMMAND" and exit -safe enable safe-mode -separator SEP set output column separator. Default: '|' -storage-version V database storage compatibility version to use. Default: 'v0.10.0' -table set output mode to 'table' -ui launches a web interface using the ui extension (configurable with .ui_command) -unredacted allow printing unredacted secrets -unsigned allow loading of unsigned extensions -version show DuckDB version
ちなみにDuckDBはシングルバイナリーみたいですね。
$ ll ~/.duckdb/cli/latest lrwxrwxrwx 1 xxxxx xxxxx 31 10月 18 20:00 /home/vagrant/.duckdb/cli/latest -> /home/vagrant/.duckdb/cli/1.4.1/ $ ll ~/.duckdb/cli/1.4.1 合計 55512 drwxrwxr-x 2 xxxxx xxxxx 4096 10月 18 20:00 ./ drwxrwxr-x 3 xxxxx xxxxx 4096 10月 18 20:00 ../ -rwxrwxr-x 1 vagrant vagrant 56833496 10月 18 20:00 duckdb*
Getting Startedをやってみる
ひとまずGetting Startedをやってみます。
基本的な実行方法は以下になるようです。
$ duckdb ⟨OPTIONS⟩ ⟨FILENAME⟩
そして、起動時にファイル名を指定しない場合はインメモリーデータベース、指定した場合は永続化したデータベースを使うようです。
## インメモリーデータベース $ duckdb DuckDB v1.4.1 (Andium) b390a7c376 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. D $ duckdb my_database.duckdb DuckDB v1.4.1 (Andium) b390a7c376 Enter ".help" for usage hints. D
Command Line Client / Usage / In-Memory vs. Persistent Database
プロンプトはDなんですね。
D select 'hello'; ┌─────────┐ │ 'hello' │ │ varchar │ ├─────────┤ │ hello │ └─────────┘ D select * from generate_series(5); ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
ちなみに補完が効きます。
Command Line Client / Usage / Editor Features
CLIでは.で始まるコマンドが使えるようです。いくつか試してみます。
Command Line Client / Usage / Dot Commands
ファイルからのSQLの読み込み。
select_example.sql
select * from generate_series(5);
.readというコマンドで読み込むようです。
D .read select_example.sql ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
.modeで出力モードの変更。
D .mode json D .read select_example.sql [{"generate_series":0}, {"generate_series":1}, {"generate_series":2}, {"generate_series":3}, {"generate_series":4}, {"generate_series":5}] D .mode csv D .read select_example.sql generate_series 0 1 2 3 4 5 D .mode markdown D .read select_example.sql | generate_series | |----------------:| | 0 | | 1 | | 2 | | 3 | | 4 | | 5 |
デフォルトはduckboxというモードのようです。
D .mode duckbox D .read select_example.sql ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
非対話形式での実行。
Command Line Client / Non-Interactive Usage
SQLファイルをリダイレクトで読み込ませる場合。
$ duckdb < select_example.sql ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
SQLを直接渡す場合。
$ duckdb :memory: 'select * from generate_series(5)' ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
第1引数はデータベースで、永続化したデータベースを使わない場合は:memoryを指定するようです。
というか、これでもいいんですよね。
$ echo 'select * from generate_series(5)' | duckdb ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
これでもよさそうです。
$ duckdb -c 'select * from generate_series(5)' ┌─────────────────┐ │ generate_series │ │ int64 │ ├─────────────────┤ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ │ 5 │ └─────────────────┘
CSVファイルの作成。
$ duckdb -c "copy (select 42 as woot union all select 43 as woot) to 'test.csv' (header);"
test.csv
woot 42 43
標準入力から読み取ってみます。
$ cat test.csv | duckdb -c "select * from read_csv('/dev/stdin')"
┌───────┐
│ woot │
│ int64 │
├───────┤
│ 42 │
│ 43 │
└───────┘
ちなみにファイルからも読めますが。
$ duckdb -c "select * from read_csv('test.csv')"
┌───────┐
│ woot │
│ int64 │
├───────┤
│ 42 │
│ 43 │
└───────┘
JSONで出力。
$ duckdb -json -c "select * from read_csv('test.csv')"
[{"woot":42},
{"woot":43}]
標準入力から読み取って、標準出力へ書き出し。
$ cat test.csv | duckdb -c "copy (select * from read_csv('/dev/stdin')) to '/dev/stdout' with (format csv, header)"
woot
42
43
コマンド的にも使えそうですね。
その他
DuckDBはCSVやJSON、Parquetなど、様々なファイルフォーマットを扱えるようです。
また拡張機能もあり、Amazon S3やMySQL、PostgreSQLとインテグレーションしたりもできるようです。
コア拡張機能のリストを見ているだけでもおもしろいです。
おわりに
DuckDBをUbuntu Linux 24.04 LTSにインストールしてみました。
本当にインストールして少し動かしただけなのですが、ドキュメントを見ているとおもしろそうだなーと思います。
使い倒すようなエントリーをここで書くかはわかりませんが、いろいろ試していってみたいと思います。