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

  関連記事

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

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

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

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

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

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

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

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

【超入門】Hivemallで機械学習 〜Treasure Dataでロジスティック回帰編〜

こんにちは。俺やで。 ビッグデータとかデータサイエンティストとかいう言葉が未だブームですね。 (「データサイエンティスト」は下火か。) ビッグデータ扱えるエンジニアも、 統計解析ができるアナリストも、 どっちもできるスーパーマンも世の中にはたくさんいますが、 ビッグデータも統計解析も扱えるインフラは …

Tableau 9.2で郵便番号の特性を地図で可視化してみる

Tableau 9.2から郵便番号地図が表示可能に 弊社ではデータ分析ツールのTableauを利用しています。オーディエンスデータの重複を分析したり、デモグラフィック属性を表示したりするなどデータの可視化に役立ちますTableauでは9.2から日本の郵便番号を用いて地図を可視化できるようになりました …

GoogleスプレッドシートからTreasureDataへデータを取り込む

AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …

x-callback-urlを使ってみた

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

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

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

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

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