🦆

Cloudflare R2 を DuckDB でクエリしてみた

2024/11/19に公開

Cloudflare R2 に格納した CSV を DuckDB を使ってクエリしてみました。
簡単な内容ではありますが、いつか必要になった時のために備忘録として記事に残します 🦆

R2 準備

クエリ対象の CSV を R2 に格納します。

log.csv
time,status_code,method,path
2024-01-01T00:00:00Z,200,GET,/api/v1/users
2024-01-01T00:00:00Z,200,POST,/api/v1/users
2024-01-02T00:00:00Z,500,POST,/api/v1/products
2024-01-02T10:00:00Z,200,GET,/api/v1/products/1
2024-02-01T00:00:00Z,404,GET,/api/v1/users/999
$ wrangler r2 object put duckdb-example/log.csv --file log.csv

DuckDB 準備

今回は macOS 環境で実行するため、Homebrew で DuckDB をインストールします。
npm installgo get 等でもインストール可能です。
詳しくはインストールページを参照してください。

$ brew install duckdb

DuckDB クエリ実行

duckdb コマンドで CLI を開始します。

$ duckdb

今回は R2 へのアクセスが発生するため、認証情報を設定します。
認証情報は CLI を中断すると初期化される挙動のため、開始する度に設定する必要があります。

D CREATE SECRET (
      TYPE R2,
      KEY_ID '<key_id>',
      SECRET '<secret>',
      ACCOUNT_ID '<account_id>'
  );

SELECT 文で CSV を読み込んでみます。

D SELECT * FROM read_csv('r2://duckdb-example/log.csv');
┌─────────────────────┬─────────────┬─────────┬────────────────────┐
│        time         │ status_code │ method  │        path        │
│      timestamp      │    int64    │ varchar │      varchar       │
├─────────────────────┼─────────────┼─────────┼────────────────────┤
│ 2024-01-01 00:00:00 │         200 │ GET     │ /api/v1/users      │
│ 2024-01-01 00:00:00 │         200 │ POST    │ /api/v1/users      │
│ 2024-01-02 00:00:00 │         500 │ POST    │ /api/v1/products   │
│ 2024-01-02 10:00:00 │         200 │ GET     │ /api/v1/products/1 │
│ 2024-02-01 00:00:00 │         404 │ GET     │ /api/v1/users/999  │
└─────────────────────┴─────────────┴─────────┴────────────────────┘

型付けも自動で行なってくれているようです。良いですね。
CREATE TABLE 文で読み込んだ CSV をテーブルにしてみます。

D CREATE TABLE log AS FROM read_csv('r2://duckdb-example/log.csv');
D SHOW TABLES;
┌─────────┐
│  name   │
│ varchar │
├─────────┤
│ log     │
└─────────┘

作成したテーブルのデータを抽出してみます。

D SELECT * FROM log WHERE status_code = '200';
┌─────────────────────┬─────────────┬─────────┬────────────────────┐
│        time         │ status_code │ method  │        path        │
│      timestamp      │    int64    │ varchar │      varchar       │
├─────────────────────┼─────────────┼─────────┼────────────────────┤
│ 2024-01-01 00:00:00 │         200 │ GET     │ /api/v1/users      │
│ 2024-01-01 00:00:00 │         200 │ POST    │ /api/v1/users      │
│ 2024-01-02 10:00:00 │         200 │ GET     │ /api/v1/products/1 │
└─────────────────────┴─────────────┴─────────┴────────────────────┘

Discussion