🐈

DuckDBに入門してみた

2023/06/24に公開

DuckDBとは

DuckDBはOLAP(オンライン分散処理)分析に特化したデータベースです。
特に高速な処理を得意とし、かつ無料およびOSSライセンスで動作します。
詳しくは公式ドキュメントを参照ください。

DuckDBの強み(公式より抜粋)

  • シンプル
      DuckDBは、コンパイル時も実行時も外部依存関係はありません。
      DuckDBの構築に必要なのは、動作するC++11コンパイラーのみです。
  • 豊富な機能
       DuckDB は、本格的なデータ管理機能を提供します。
       大規模な関数ライブラリ、ウィンドウ関数などを使用してSQLの複雑なクエリを広範囲にサポートしています。
       DuckDB は Python および R に深く統合されており、効率的な対話型データ分析が可能です。
       DuckDB は、Java、C、C++ などの API を提供します。
  • 処理の速度
      DuckDB は、オンライン分析処理 (OLAP)とも呼ばれる分析クエリ ワークロードをサポートするように設計されています。
      これらのワークロードは、テーブル全体の集計や複数の大きなテーブル間の結合など、格納されたデータセットの重要な部分を処理する複雑で比較的長時間実行されるクエリによって特徴付けられます。
      データへの変更もかなり大規模になることが予想され、複数の行が追加されたり、テーブルの大部分が同時に変更または追加されたりします。
  • 無料
      DuckDB はオープンソースであり、ソース コード全体は GitHub で無料で入手できます。
      私たちは、当社の行動規範を遵守する限り、誰からの貢献も歓迎します。

DuckDBを選んだ理由

以下のように選択基準があり、それを満たすものを探していたらDuckDBに行きつきました。
・無料で利用できること
・OLAP用に作られたデータベースであること

DuckDBのインストール

公式ドキュメントの手順に従ってインストールしました。

Linux用のバイナリパッケージを解凍します。

ちなみに今回落としたパッケージはhttps://github.com/duckdb/duckdb/releases/download/v0.8.1/duckdb_cli-linux-amd64.zipです。

unzip duckdb_cli-linux-amd64.zip

DuckDBの起動

./duckdbコマンドだけでも実行できますが、その状態だとインメモリデータベースとして起動して、データを保持しません。

root@28b9c609ac51:/duckdb_work# ./duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D

なので、データ保持させるには引数にファイル名を入れてあげます。

./duckdb test.duckdb

どのような操作ができるか確認するには.helpを入力します。

root@28b9c609ac51:/duckdb_work# ./duckdb test.duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
D .help
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
~略~
.timer on|off            Turn SQL timer on or off
.width NUM1 NUM2 ...     Set minimum column widths for columnar output

初期のデータベースとテーブルを確認する

データベースを確認するには.databaseコマンドで確認できます。
見た感じ、.duckdbコマンドの引数に渡したtest.duckdbがデータベースに相当するみたいですね。
そして、.tablesコマンドでテーブルを確認できます。
初期状態だと、作成されていないので表示されません。

D .database
test: test.duckdb
D .tables
D

CSVファイルをインポートしテーブルを作成する

適当なCSVファイを用意します。
私がduckdbを起動している環境がmac book proのDockerコンテナ上なので、コンテナ上にCSVファイルを転送します。

docker cp veg_plant_height.csv 28b9c609ac51:/tmp/veg_plant_height.csv
docker exec -it 28b9c609ac51 bash
root@28b9c609ac51:/# ls /tmp/
veg_plant_height.csv

CSVファイルをduckdbと同じ階層に持ってきます。

root@28b9c609ac51:/duckdb_work# ls
duckdb  test.duckdb  veg_plant_height.csv

DuckDBへCSVファイルを取り込みます。

root@28b9c609ac51:/duckdb_work# ./duckdb test.duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
D create table veg_plant_height as select * from read_csv_auto('veg_plant_height.csv');

SELECT句を使ってCSVファイルが取り込まれているか確認します。

D SELECT * from veg_plant_height limit 5;
┌────────────────────┬─────────┬──────────────────┬───────────────────┐
│     plant_name     │   UOM   │ Low_End_of_Range │ High_End_of_Range │
│      varchar       │ varchar │      int64       │       int64       │
├────────────────────┼─────────┼──────────────────┼───────────────────┤
│ Artichoke          │ F       │                4 │                 5 │
│ Arugula            │ I       │                8 │                10 │
│ Asparagus          │ F       │                4 │                 6 │
│ Beans, bush        │ I       │               24 │                30 │
│ Beans, lima (bush) │ I       │               24 │                36 │
└────────────────────┴─────────┴──────────────────┴───────────────────┘
D

基本的なDMLはサポートしているので、気になる方は公式ドキュメントを参照してみてください。

まとめ

まだ大規模なデータの分析やデータ抽出ができていませんが、導入はとても簡単です。
その他のDWH製品を利用している際に常に怯えていたトライアル期間やコスト面を考えなくて良いのがとってもいいと思いました!
使い方についてはこれから学習していきたいと思いますので、継続して記事にしていきます。

次回はdbt x DuckDBをやってみたいと思います!

Discussion