🦆
DuckDB で JSON Lines 形式のログを精査する
まとめ
- 圧縮された複数の JSON Lines を読み込める
- S3 から直接読み込める
- 好きなタイミングで Parquet で出力
DuckDB とは
こちらをどうぞ。
DuckDB雑紹介(1.1対応版)@DuckDB座談会 - Speaker Deck
圧縮済みのログを読み込む
解析対象のログファイルって spam-20240501.jsonl.gz
や egg-20240601.jsonl.zst
みたいに圧縮されていたりします。
特に日付単位で分かれてたりすることは多いです。そこから目的のログを探し出すのは、基本はスクリプトを書くことが多いと思います。
DuckDB を使えば色々解決します。
SELECT * FROM read_json_auto('spam-*.jsonl.zst')
これだけで圧縮された複数の JSON Lines 形式のログを読み込むことができます。
- https://duckdb.org/docs/guides/file_formats/json_import.html
- https://duckdb.org/docs/data/json/overview.html
- https://duckdb.org/docs/extensions/json.html
そのログがどのファイルにあるかを知りたい
SELECT * FROM read_json_auto('spam-*.jsonl.zst', filename=true)
これでなんと filename
というカラムを自動的に作成してくれます。これでどのログファイルからよ見込んだのかも一発です。
S3 から直接読み込む
ログファイルは S3 に保存してあることも多いと思います。
CREATE SECRET (
TYPE S3,
KEY_ID 'secret_key',
SECRET 'secret_value',
REGION 'region'
);
SELECT * FROM read_json_auto('s3://example/spam-*.jsonl.zst')
これで S3 から直接読み込むことができます。
- https://duckdb.org/docs/extensions/httpfs/s3api.html
- https://duckdb.org/docs/guides/network_cloud_storage/s3_express_one.html
読み込んだログをテーブルにする
CREATE TABLE ... AS
で読み込んだログをテーブルにすることができます。
CREATE TABLE spam AS SELECT * FROM read_json_auto('s3://example/spam-*.jsonl.zst')
好きなタイミングで整理したログを Parquet で出力
SQL をこねこねして目的の情報だけを抜き出したら、圧縮率の高い Parquet 形式に出力できます。
もちろん S3 に直接アップロードもできます。
COPY (SELECT ...) TO 's3://example/spam2.parquet' (FORMAT parquet, COMPRESSION zstd);
雑感
- 本当に便利すぎてスゴイ
- SQL を共有するだけで解析ツール共有になる
- 複数のログも JOIN で頑張れる
とにかく便利なので是非使ってみてください。
Discussion