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

  関連記事

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

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

Amazon ElastiCache/Redisのパフォーマンス確認

はじめに こんにちは、AudienceOne開発部です。AudienceOne開発部ではいわゆるビッグデータと呼ばれる大量のデータをアドホックあるいは定常的に日々ETLだの集合演算だのをする一方で、様々な大規模データ処理ソリューションを継続的に検証しております。 本記事は、その中でもユーザが保持して …

HivemallでMinhash!〜似てる記事を探し出そう。〜

こんにちは。俺やで。 前回の投稿に続き(間が空きましたが)、 ビッグデータに対応したHiveで使える機械学習ライブラリ、 「Hivemall」の使い方、第2弾となります。 今回はMinhashという手法について書きたいと思います。 ※前回 【超入門】Hivemallで機械学習 〜Treasure D …

no image
Treasure Dataで長期間の集計

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

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

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

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

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

Android 非同期処理についてまとめてみた

Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。 今回は非同期処理の代表的な ・Service ・IntentService ・HandlerThread について違いを踏まえながらまとめます! 非同期処理について(http://codezine.jp/articl …

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

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

x-callback-urlを使ってみた

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

ゼロからAngularでSPAを作ってみた(3) CI: 継続的インテグレーション編

前回までのおさらいと今回やること 前々回(はじめてのアプリ編)と前回(デプロイ・公開編)で、作成した Angular のチャットアプリを Web に公開するところまでいきました。 でも、デプロイするのに、毎回決まったコマンドを打つのって面倒ですよね。 今回は GitHub でソースコードを管理して、 …