【12/21】DuckDBの特徴、および使える場面
入社2年目の駒村です。今年はSIerのETL改修案件に携わっており、たくさんのデータベースを扱っています。今回の投稿では、今年に入ってから名前を聞くことが多くなったDuckDBを簡単にご紹介します。既にご存知の方も多いとは思いますが、後半で活用事例も挙げていますのでさらっと読んでいただけると幸いです。
DuckDBとは
DuckDBは、オープンソースの組み込み型OLAP (Online Analytical Processing)SQLデータベース管理システム(DBMS)です。意味は以下の通りです。
組み込み型: 単一のプロセス内で動作し、環境構築をしなくても手軽に利用できる。SQLiteと同様。対照は、MySQLやPostgreSQL、Snowflakeなどのクライアント・サーバ型。
OLAPデータベース: 膨大なデータの多次元分析を高速に処理することができる、データ分析に適したデータベース。SnowflakeやClickHouse、BigQueryなどと同様。対照は、トランザクション処理に適したMySQLやPostgreSQLなどのOLTP (Online Transactional Processing)データベース。
SQLデータベース: SQLに対応している(NoSQLではない)。
代表的なDBMSを分類すると、以下のようになります。
DuckDBの特徴
手軽に使える
DuckDBのプログラムは単一の実行ファイルであり、インストールが不要です。GitHubから最新リリースをダウンロードすれば、サーバのセットアップなどをしなくてもすぐに使い始めることができます。
処理が高速
OLAPデータベースなので、データ処理がとても高速です。DuckDBは継続的にパフォーマンスの改善に取り組んでおり、昨年までのDuckDBと比べても非常に高速になっています。
様々な形式でのインポート・エクスポートに対応している
DuckDBは、CSV・JSON・Parquet・Excelなど、様々なファイル形式のインポート・エクスポートに対応しています。そればかりでなく、MySQLやPostgreSQLなどの外部データベースに接続してデータを取得したり、S3などのオブジェクトストレージからAPI経由でファイルを読み込むこともできます。
SQLの機能が豊富
CTEや窓関数などの高度なSQL構文をサポートしている上に、SQLの中で使える関数も非常に充実しており、文字列処理や日付時刻の計算をDuckDBだけで完結させることができます。
また、DuckDBのシェル(REPL)は構文強調や補完機能が便利なので、SQLiteのデータベースを読み書きするインタフェースとしてもDuckDBを使いたくなるほどです(実際に可能です)。
周辺エコシステムの開発も活発
DuckDB本体はC++で書かれていますが、ウェブブラウザで動かすことのできるWebAssembly版のDuckDB-Wasmや、DuckDBのデータ分析エンジンをPostgreSQLに埋め込むことのできるpg_duckdbなども現れています。様々な環境で動かすことができる組み込みデータベースという特徴を活かして、画期的なアプリケーションが登場しています。
DuckDBが使える場面
データ分析
DuckDBを以下のようなソフトウェアと組み合わせることで、低コストなETL/ELT(データパイプライン)を構築することができます。
Airflow / Dagster / Kestra / etc.
Dbt / SQLMesh / Semantic Data Fabric / etc.
もっと簡単にデータ分析がしたいというエンドユーザ向けに、DuckDB-Wasmを利用したEvidenceというBI (Business Intelligence)ツールもあります。Jupyter Notebookなどと似ていますが、SQLとMarkdownだけでウェブサイトを構築することができ、Python不要という敷居の低さは魅力です。
エンタープライズや金融案件などで本格的な大規模データ分析基盤を構築するときは、DuckDBではなくSnowflakeなどのクライアント・サーバ型のOLAPデータベースを利用しましょう。これはデータエンジニアやクラウドエンジニアの専門性が必要な仕事という認識です。
コマンドラインツールとして
DuckDBは軽量なプログラムなので、コマンドラインツールとしてシェルスクリプトの中で利用することができます。JSONを読み込むことができるので、JSON変換ツールとしても使えます。以下はコマンドの一例です。
duckdb -c \
"select license->>'key' as license, count(*) as count \
from read_json('https://api.github.com/orgs/golang/repos') \
group by 1 \
order by count desc"
私はレガシーコードの改修調査でDuckDBを使いました。大手SIerの案件は開発環境に制限があったりしますが、標準的なUNIXコマンドにDuckDBを組み合わせるとかなり色々なことができ、作業を効率化できます。
SQLは基本的には表データを処理するものですが、Recursive CTEで木構造などのグラフデータも解析できます。たとえばモジュールの依存関係も、SQLで解析することができます。
Webフロントエンド
DuckDB-Wasmを利用することで、ウェブブラウザの中でSQLを動かすことができます。最近はOrigin Private File System (OPFS)に全メジャーブラウザが対応したことで、DuckDB-WasmとOPFSを組み合わせた活用事例が現れています。データベースサーバが不要になればインフラ費用も削減できますし、クライアントのデータをサーバに送らないほうがプライバシーも保ちやすいですね。
バックエンド
DuckDBはJSONを読み込むことができます。バックエンド開発で重要なものの一つはログですが、1行につき1レコードのJSON Lines形式でログを出力するようにすれば、DuckDBで簡単に処理できますね。最近のサーバサイド言語では、structured loggingのライブラリを使うことでJSONに対応できます。
まとめ
簡単に使えてWebAssemblyでも動作するDuckDBは、知っておくと便利なツールの一つだと思います。特にフロントエンドの視点で面白いと思いますが、その他にも様々な場面で役に立ちます。ぜひ試してみてください。
Marvelが少しでも気になった方は是非Wantedlyもご覧ください🙌