json形式のログからデータ抽出をしないといけなくなって、さてどうしようかと考えた結果、以前使ったApache Drillを久しぶりに使ってみたら、思いのほかスムーズに欲しいデータが抽出できて満足したので手順のメモです
こんな人向け
- json形式のログから必要なデータをSQLっぽく抽出したい
- でも抽出のためにいちいちDB作ったりCSVに変換したりしたくない → jsonのままなんとかしたい
- これのために新しいツールとかインストールしたりしたくない → Dockerだけでなんとかしたい
サンプルデータ
こんな感じに、jsonオブジェクトが1行ごとに並んでいる、とあるテストの実行ログを使います。 log.json
1 | $ cat log.json |
DockerでApache Drillを使う
apache/drillイメージを使用します
1 | $ ls |
普通にselect
普通に5件参照
1 | apache drill> select * from dfs.`/mnt/log.json` limit 5; |
order byでソート
time
で降順ソート
1 | apache drill> select * from dfs.`/mnt/log.json` order by `time` desc limit 5; |
group by
fail
で集約してカウント
1 | apache drill> select fail,count(*) as cnt from dfs.`/mnt/log.json` group by `fail`; |
between
time
で期間の絞り込み
1 | apache drill> select * from dfs.`/mnt/log.json` where `time` between '2021-05-07 15:40:00' and '2021-05-07 15:45:00' ; |
可変長構造のjson
NoSQL的に扱えます。たとえばこんなデータ
1 | $ cat log.json |
null
扱いになります
1 | apache drill> select * from dfs.`/mnt/log.json`; |
補足情報: ネスト構造のjson
ここでは例示しませんが、Nested Data Functionsの、FLATTENなどを使用すると、ネスト構造を持ったjsonなども解析出来ます
参考サイト: ネスト構造のJSONデータにApache Drillで直接SQLクエリをかける - nagix
補足情報: RDBMS Storage Plugin
また、RDBMS-STORAGE-PLUGINを使用すると、RDBMSとjsonデータをunionで縦結合して解析するみたいな事も出来ます
Apache Drillを終了する
1 | apache drill> !quit |
マニュアル
以上のように、一般的なSQLで使用する構文はそのまま使用出来ます。公式にSQLリファレンスもあるのでご参考下さい