DuckDBに入門してみた
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