CUBE SUGAR CONTAINER

技術系のこと書きます。

dbt を DuckDB で使う

OLAP (OnLine Analytical Processing) の用途に特化した組み込みの RDBMS に DuckDB がある。 そして、dbt には DuckDB 向けのアダプタがあるので、バックエンドのデータベースとして利用できる。 これは、ローカルのマシンでデータ分析をしたり、dbt の機能を試す際に有益と考えられる。 そこで、今回は環境をセットアップする流れをメモ的に書いておく。

使った環境は次のとおり。

$ sw_vers
ProductName:        macOS
ProductVersion:     14.3.1
BuildVersion:       23D60
$ python -V    
Python 3.11.7
$ dbt -v    
Core:
  - installed: 1.7.8
  - latest:    1.7.8 - Up to date!

Plugins:
  - duckdb: 1.7.2 - Up to date!

もくじ

下準備

まずは DuckDB 向けの dbt アダプタである dbt-duckdb をインストールしておく。 dbt の本体である dbt Core も依存関係として一緒に入る。

$ pip install dbt-duckdb

あとは DuckDB の CLI をインストールしておく。

$ brew install duckdb

プロジェクトをセットアップする

基本的には dbt init を使うことで、対話的にプロジェクトのひな形を作れる。

$ dbt init

ただし、手っ取り早くセットアップしたいときは、以下のように設定ファイルを直接作っても良い。

まず必要なのはプロジェクトの情報を記述した dbt_project.yml という YAML ファイル。

$ cat << 'EOF' > dbt_project.yml 
config-version: 2
name: 'dbt_duckdb_example'
version: '1.0.0'
profile: 'dbt_duckdb_example'
EOF

次に、データベースに接続するためのプロファイルの設定ファイルを用意する。 デフォルトでは $HOME/.dbt/profiles.yml の内容が使われる。

以下では dbt_duckdb_example という名前のプロファイルを定義している。 プロファイルの名前は先ほどの dbt_project.yml で記述した profile と揃える必要がある。 なお、以下のコマンドは既に dbt を使っていてプロファイルの設定ファイルがある場合には上書きされてしまう点に注意すること。

$ mkdir -p ~/.dbt
$ cat << 'EOF' > ~/.dbt/profiles.yml
config:
  send_anonymous_usage_stats: False

dbt_duckdb_example:
  outputs:
    dev:
      type: duckdb
      path: dev.duckdb
  target: dev
EOF

上記で dbt_duckdb_example.outputs.devdev というターゲット (環境)の設定をしている。 ターゲットは開発用、ステージング用、本番用などで複数作れる。 そして dbt_duckdb_example.outputs.dev.typeduckdb を指定することで、データベースへ接続する際のアダプタとして dbt-duckdb が使用される。 dbt_duckdb_example.outputs.dev.path は dbt-duckdb アダプタ固有の設定でデータベースのファイルパスを表す。 dbt_duckdb_example.target はデフォルトで実行するターゲットを指定している。

以上で必要な設定ファイルができた。 続いては dbt debug コマンドを実行してみよう。 このコマンドはデータベースへの接続を確認するためのもの。

$ dbt debug
10:46:05  Running with dbt=1.7.8
10:46:05  dbt version: 1.7.8
10:46:05  python version: 3.11.7
...
10:46:05  Connection:
10:46:05    database: dev
10:46:05    schema: main
10:46:05    path: dev.duckdb
10:46:05    config_options: None
10:46:05    extensions: None
10:46:05    settings: None
10:46:05    external_root: .
10:46:05    use_credential_provider: None
10:46:05    attach: None
10:46:05    filesystems: None
10:46:05    remote: None
10:46:05    plugins: None
10:46:05    disable_transactions: False
10:46:05  Registered adapter: duckdb=1.7.2
10:46:05    Connection test: [OK connection ok]

10:46:05  All checks passed!

問題なくデータベースに接続できればコマンドが正常終了する。

任意の場所にあるプロファイルの設定ファイルを使いたい場合

なお、$HOME/.dbt 以外の場所にあるプロファイルの設定ファイルを使用することもできる。 その場合は dbt コマンドに --profiles-dir オプションを指定すれば良い。

$ cat << 'EOF' > profiles.yml
config:
  send_anonymous_usage_stats: False

dbt_duckdb_exaple:
  outputs:
    dev:
      type: duckdb
      path: dev.duckdb
  target: dev
EOF
$ dbt debug --profiles-dir .

データベースの内容を確認する

dbt debug コマンドを実行すると、ひとまずデータベースのファイルができる。 このときファイル名は、先ほどプロファイルで指定した path に対応する。

$ ls -1                   
dbt_project.yml
dev.duckdb
logs
profiles.yml

DuckDB の CLI を使って接続してみよう。 中身は空っぽではあるものの、ちゃんと利用できることが確認できる。

$ duckdb dev.duckdb         
v0.10.0 20b1486d11
Enter ".help" for usage hints.
D

いじょう。