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エンジニア採用情報

  関連記事

no image
AWSにRailsアプリをデプロイする(公開編)

次にデプロイするため“aws rails デプロイ”でググってみるとunicorn、nginxというキーワードがでてくるので とりあえずこれを設定していきます。   アプリのsecret_key_baseの設定 [crayon-5c93089428ecb358355 …

Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

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

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

Scala入門 準備編「開発環境構築」 – PHP使いからScala使いへ転身!

  はじめに みなさんこんにちは、今月入社しましたプロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 XmediaOneの開発で採用しているプログラム言語はS …

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

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

HyperLoglogでcount distinctを速くする

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

no image
AWSにRailsアプリをデプロイする(準備編)

今回は、せっかくRailsで開発したアプリをAWS上に公開してみたいので その構築方法をまとめていきたいと思います。 (前回の記事:初心者がRailsで開発 – deviseでユーザー認証設定 ) AWSの設定はすでに社内で使用できるようになっていたので割愛します。 ★やりたいこと Gitlabでコ …

初心者がRailsで開発 – deviseでユーザー認証設定 –

こんにちは、2年目のYukaです。 開発部所属でありながら実は、、 実際に自分で手を動かして開発する機会がなかなかありませんでした。。 しかしついに、、、 開発初心者がRailsでWebアプリの開発に挑戦します!! 今回のゴールは社内でも使用しているGoogleアカウントで簡単にログインができるよう …

x-callback-urlを使ってみた

x-callback-urlとは? iOSのアプリ間連携の仕様の一つみたいです。簡単に言うと、ディープリンクを行うためにカスタムURLスキームを利用するが、アプリ毎にバラバラな規則でURLスキームを設定するとアプリ間連携をスムーズに行うことができないため、どのような規則でURLスキームを設定するかを …

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

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