🦆
Cloudflare R2 を DuckDB でクエリしてみた
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 install
や go 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