fastavroとjqでAVRO形式のファイルからデータを取得しよう

     - ビッグデータ, 未分類, 開発ツール  


AVRO形式のファイルを取り扱いたい

AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。

弊社内での一部システムのログデータにも利用されているのですが、専用のバイナリ形式であるため、テキストエディタで内容を確認することができません。そこで今回はPythonを用いてAVRO形式のデータを変換して内容を確認する方法を紹介します。

fastavroのインストール

Pythonからavroを取り扱うためには、fastavroをインストールする必要があります。仮想環境を作成して、fastavroをインストールします。

※今回はPython 3.6.0環境で作業を行っています。

$ mkdir avro
$ python3 -m venv avro/
$ cd avro/
$ . bin/activate
(avro) $ pip3 install fastavro

fastavroを活用してjson形式に変換

以下のプログラムでJSON形式として文字列を出力させます。

import sys
import fastavro as avro
import json

if (len(sys.argv) != 2):
sys.stderr.write('usage: python test.py {filename}n')
exit(2)

with open(sys.argv[1], 'rb') as fo:
for recode in avro.reader(fo):
print(json.dumps(recode), flush=True)

利用法

$ python3 test.py testlog.avro > out.json

jqをもちいてjson形式のファイルから値を取得

以上までで avro 形式のファイルを json 形式に変換できました。JSON形式のファイルは jq コマンドを用いることで特定の値を取得することができます。各環境にあわせて jq コマンドをインストールします。

# mac では homebrew でインストールする
$ brew install jq

以下のような構造のログから jq コマンドを用いて各ログにあるipアドレスを取得します。

{"request": {"datetime": "2017-02-03 00:00:00", "ip": "10.0.xxx.xxx", ……
{"request": {"datetime": "2017-02-03 00:00:01", "ip": "10.0.xxx.xxx", ……

-rをオプションを用いると、文字列のクォーテーションを除去してくれます。

$ jq -r '.request.ip' out.json
10.0.1.xxx
10.0.2.xxx
10.0.1.xxx
10.0.2.xxx

パイプラインを繋げてソートと重複除去を行うことでIPアドレスの一覧を作成します

$ jq -r '.request.ip' out.json | sort | uniq
10.0.1.xxx
10.0.2.xxx

まとめ

fastavroとjqでAVRO形式のファイルからデータを取得する方法を紹介しました。fastavroを用いてAVROのJSON化を行うことでTreasureDataに格納したり、jq コマンドから取り扱うことが可能となります。AVRO形式のログファイルを扱っている場合には今回紹介した方法をためしてみてはいかがでしょうか。


DACエンジニア採用情報

  関連記事

data-tenki
気象予報士とビッグデータ解析の意外な関係

DACから気象予報士が誕生しました ビッグデータ解析部のMikeです。 2015年1月の気象予報士試験に合格し、めでたく4月からアドテク業界ただ一人(本当?)の気象予報士となりました 。 そんなわけで、今回は気象予報士とビッグデータ解析の関係についてお話したいと思います。 なぜ気象予報士を目指したか …

bigdata
HyperLoglogでcount distinctを速くする

こんにちは。俺やで。 HyperLoglogについて書きます。おもしろいです。名前が。 ■1. HyperLoglogとは? count distinctを速くするアルゴリズム 以前、Minhashについて書きました。 (Treasure Dataさんのブログにも載せていただきました。ありがとうござ …

heatmap_thumbnail
Treasure Data で集計した結果を Google Spreadsheet に出力する

同じチームのメンバーが書いた記事に便乗します。 【入門編】TreasureDataでサイトのアクセス解析をしてみた~第2弾!~ で紹介しております 曜日・時間帯別のセッション数 のヒートマップを毎週 Google Spreadsheet に出力し、さらにそのヒートマップを自動的に Slack に通知 …

11396380473_26f323b1e4_z
Google BigQuery / Tableauを使ってみた

TableauからGoogle BigQueryへ接続してみました。 弊社で利用しているTreasureDataからデータ出力してBigQueryへロード、Tableauから接続まで実際に行った手順について記載します。 TreasureDataからAmazonS3へデータ出力 まず、データが蓄積され …

image2
自社サービスのDocker化(前編)

こんにちは。 インフラ開発部の上田です。 普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。 今回は、近年話題になっているDockerについて、取り上げてみようと思います! なぜDockerなのか・・・? そもそもDockerとは何か・・・?   当社では様々なサー …

全ファイルを検索
意外と知らないかも? Chrome DevTools の機能10選

みんな使っている Chrome DevTools。 Web開発やトラブルシューティングには必須ですが、便利な機能を知らないで使っている人がいたり、Web で使い方を調べても古い情報だったりすることがあるので、部内で Chrome DevTools についての勉強会を開催しました。 ここでは、その中か …

Libra
【HTML5】4ツール出力ファイルサイズ比較

こんにちは、近江です。 前回もHTML5のSwiffyについて書かせて頂きましたが、まだまだHTML5について調査しています。 今回はSwiffyを含めた4つのHTML5系ツールで、同じ素材で同じアニメーションを作成した時のファイルサイズを比較したいと思います。 何故ファイルサイズの比較をするかと言 …

gnu
いまさらですが… GNU screen チートシート

最近はローカル環境で開発するようになってきたので、screen コマンドを使う機会も少なくなって来たような気がします。で、使ってないと忘れてしまうので、チートシートを作ってみました。 参照サイト GNU screen [quick_reference] 起動 コマンド 動作 screen -S &l …

chain
PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

toadstool
【Hivemall入門】RandomForestで毒キノコ推定モデルを作る

こんにちは。俺やで。 今回も前回から間が空いてしましたが、ビッグデータに対応したHiveで使える機械学習ライブラリ、 Hivemallの使い方について、書かせていただければと思います。 なお今回はQiitaのTreasure Data / Advent Calender 2015の12/3日分として …