目次
こんにちは kyuita です。
皆様はシステムエンジニアとして働いているとこんな場面に身に覚えがないでしょうか。
・クラウドストレージ(GCS, S3 など)にログデータをアーカイブとして残している。だけど一度も中身を見たことない。
・突然の依頼で大量のデータが納品されてデータの中身を把握しないといけない。
そんな時にクラウドストレージにあるデータを気軽に解析できたら便利ですよね。
そこで、DuckDB を使って解析ができるか試みます。
DuckDB とは
DuckDB とは PostgreSQL 構文で利用できる OLAP(オンライン分析処理)、カラムナ型(列指向)、データベース管理システムだそうです。
ローカルファイルや Web 上のデータを指定して SQL を発行できるようなイメージでしょうか。
データソースとして CSV, JSON , Parquet, Excel など他にも様々あり圧縮したままの状態でも扱える、大量のデータをローカルで高速に分析できるなどの特徴があるようです。
DuckDB をインストールする
筆者は mac を使っていて Homebrew が使えたのでそれでインストールしました。
環境にあったインストール方法を DuckDB 公式 が用意してくれているので自分の環境にあった方法を選んでください。
DuckDB でローカルファイルを読み込む
適当な CSV で DuckDB を試してみましょう。
気象庁から 最新の気象データ1 を CSV でダウンロードして DuckDB でカウントを取ってみます。
[Local:~]$ duckdb
v1.2.1 8e52ec4395
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D
D select count(*) from read_csv('~/Downloads/pre1h00_rct.csv');
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 1284 │
└──────────────┘
このように CSV に対して SQL のクエリで検索できるようになります。
これだけでもデータの絞り込みや分析に使えそうな気がしてきました。
DuckDB でインターネット上にあるファイルを読み込む
今度はダウンロードしたファイルを読み込むのではなくてインターネット経由で直接読んでみましょう。
公式がサンプルファイルを用意してくれているのでそれをリモートで読み込みます。
D SELECT * FROM 'https://shell.duckdb.org/data/tpch/0_01/parquet/orders.parquet' LIMIT 10;

このようにインターネット上に置かれているファイルにもリモートでアクセスすることができます。
インターネット上のファイルを読み込めることがわかりました。
DuckDB でクラウドストレージにあるファイルを読み込む
それでは本題のクラウドストレージ上にあるデータを読み込んでみましょう。
今回は GCS にあるファイルを読み込んでみます。DuckDB 公式が GCS Import を用意してくれているのでそれを使います。
CloudLogging から GCS にエスクポートしたロードバランサーのログを見てみましょう。
対象の GCS の中身。

GCP コンソール側で HMACKeys を発行して DuckDB に登録。

対象バケットに作成した HMACKeys を発行したサービスアカウントにオブジェクト閲覧できる権限を付与。
DuckDB から対象のバケットに対して SQL を実行します。
D SELECT * FROM read_json('gs://sample/requests/2025/03/07/06:00:00_06:59:59_S0.json') LIMIT 5;

GCS 上のファイルにアクセスできました。
ワイルドカードでのファイル指定
一つのファイルだけでなくディレクトリ内のファイル全体に対しての検索もワイルドカード記述で可能です。
D SELECT count(1) FROM read_json('gs://sample/requests/2025/03/07/*.json');

検索結果のローカル保存
さらに、リモートで読み込んだ SELECT 結果をローカルメモリ上のテーブルで保存することもできます。
そうすることで都度都度クラウドサービス間と通信をすることがなくなり、通信料金などを気にせずローカルでクエリを発行し放題になります。
D CREATE TABLE tmp AS SELECT * FROM read_json('gs://sample/requests/2025/03/07/06:00:00_06:59:59_S0.json') LIMIT 5;
D select * from tmp;

ここまで来たら欲しいデータを対象とした検索条件(日付・エラー)を使うことでデータの解析を行うことが出来そうです。
感想と発展
思ったより簡単に使えて非常に強力なツールです。
アプリログの中からエラーだけを抽出したり、特定の日付のログ件数をカウントしたりなどが気軽に行えるようになるのは便利だと思います。
また今回使った基本的な機能以外にも色々とあり、中には Grafana と連携するプラグインもあるみたいなので深掘りしていきたいと思います。
皆様も普段見たことがないデータなどあったら DuckDB で気軽に見てみてはいかがでしょうか。
脚注

