🦆

DuckDB で JSON Lines 形式のログを精査する

2024/10/15に公開

まとめ

  • 圧縮された複数の JSON Lines を読み込める
  • S3 から直接読み込める
  • 好きなタイミングで Parquet で出力

DuckDB とは

こちらをどうぞ。

DuckDB雑紹介(1.1対応版)@DuckDB座談会 - Speaker Deck

圧縮済みのログを読み込む

解析対象のログファイルって spam-20240501.jsonl.gzegg-20240601.jsonl.zst みたいに圧縮されていたりします。
特に日付単位で分かれてたりすることは多いです。そこから目的のログを探し出すのは、基本はスクリプトを書くことが多いと思います。

DuckDB を使えば色々解決します。

SELECT * FROM read_json_auto('spam-*.jsonl.zst')

これだけで圧縮された複数の JSON Lines 形式のログを読み込むことができます。

そのログがどのファイルにあるかを知りたい

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 から直接読み込むことができます。

読み込んだログをテーブルにする

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);

https://duckdb.org/docs/sql/statements/copy.html

雑感

  • 本当に便利すぎてスゴイ
  • SQL を共有するだけで解析ツール共有になる
  • 複数のログも JOIN で頑張れる

とにかく便利なので是非使ってみてください。

Discussion