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

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


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

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

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

fastavroのインストール

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

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

[code lang=text]
$ mkdir avro
$ python3 -m venv avro/
$ cd avro/
$ . bin/activate
(avro) $ pip3 install fastavro
[/code]

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

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

[code lang=python]
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)

[/code]

利用法

[code lang=text]
$ python3 test.py testlog.avro > out.json
[/code]

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

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

[code lang=text]
# mac では homebrew でインストールする
$ brew install jq
[/code]

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

[code lang=text]
{"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", ……
[/code]

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

[code lang=text]
$ jq -r '.request.ip' out.json
10.0.1.xxx
10.0.2.xxx
10.0.1.xxx
10.0.2.xxx
[/code]

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

[code lang=text]
$ jq -r '.request.ip' out.json | sort | uniq
10.0.1.xxx
10.0.2.xxx
[/code]

まとめ

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


DACエンジニア採用情報

  関連記事

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

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

Scala番外編「Boxに保存したファイルをBox APIを使ってダウンロードしよう!」

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Box APIを使う背景・目的 DACはメディアレップです メディアレップとは、インタ …

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

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

【クラウド初心者向け】Google Cloud Platform(GCP)でWebサイトを公開してみよう!

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 背景 わたくしは最近プライベートで開発したWebサービスをインターネット上に公開しまし …

【電子工作入門】Arduino + Processingでアラート監視してみた

こんにちは、プラットフォームワンのyamakenです。普段はフロントエンド中心にDSP周りの開発をやっています。現在新卒2年目です。 広告会社のエンジニアブログということで皆さんビッグデータやインフラなどためになりそうな記事をあげていらっしゃいますが、今回は少し趣向を変えて電子工作チックな内容をお届 …

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

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

no image
Treasure Dataで長期間の集計

プラットフォーム・ワン T氏です。プラットフォーム・ワンでは、DSPのMarketOneとSSPのYIELD ONE提供しています。 MarketOneやYIELD ONEのログを調査する場合にTreasure Dataを使うことがあります。Treasure Dataでは大量のデータに対してHive …

D3.jsとその活用事例について

D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …

Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

クラウド電話API “Twilio”で起こされてみた

どうも、開発部のクラヴマガです。 弊社サービスも最近はAWSの様なクラウド環境でサービスを構築することが多くなりました。 そこで問題になるのが、障害などによる深夜対応・・・。 データセンターに物理サーバをおいていた頃は、データセンターから障害発生時に 電話連絡をもらっていたのですが、クラウド環境では …