CSVからMessagePack形式への変換スクリプト

 初めまして、本年度サイオステクノロジー新入社員の髙橋達です。 4月から、Treasure Data(以下、TD)チームに配属となり、ビッグデータやクラウドソリューションについて勉強をしています。 元々、環境知能という研究分野に携わっており、SNSやカメラなどの環境センサを駆使して、人の行動を分析し、ロボットやスマホなどで人にサービスを提供することを目指すという研究を行っていました。 今後は、ビッグデータやTDについて、情報発信をして行けるように頑張ります。

 さて、話は変わって、今回は、TDにデータを一括でアップロードする際に利用するMessagePack(msgpack)に関するプログラムを紹介します。

1. csvからmsgpackへの変換

1.1. 概要

 TDでは、ファイルのインポートには、JSON形式かmsgpack形式のどちらかで行う事が可能です。 そのため、ログデータで用いられることが多いcsv形式からmsgpack形式に変換することが多々あります。 そこで、csv形式のファイルからmsgpack形式に変換を行い、msgpack形式のファイルをTDにアップロードするという一連の流れを追いながら、 プログラムの説明を行いたいと思います。

1.2. msgpackについて

 msgpackとは、JSONよりも効率の良いシリアライズフォーマットです。 JSONよりもデータサイズが小さく、CPU負荷も低く、高速です。そのため、長い文字列を扱う際に、より効果を発揮します。どの程度、JSONより優れているかを、開発者の古橋さんのスライドをお借りして紹介します。下記のTwitterのツイートのシリアライズを行った際のグラフでは、約7倍高速にシリアライズが行えている事が分かります。 また、開発者の古橋さんはTreasure Data Inc.の開発者でもあり、TDとの連携も万全です。

1.3. 開発環境

  • Mac 10.8.3
  • Ruby 1.9.3
  • msgpack-ruby 0.5.4
  • TD 0.10.75

1.4. 処理の流れ

  1. コマンドラインからの引数の取得
  2. csvファイルの読込み
  3. ヘッダーの作成
  4. ファイルからのcsv読み込みとhashへの変換
  5. msgpackファイルへの変換と書出し

1.5. 利用するcsvデータについて

 今回、csv形式のデータには、オープンデータとして公開されている千葉県流山市のAEDの設置場所のデータを利用します。 こちらのデータを使う理由としては、位置情報を含む建物などのデータとtwitterのつぶやきデータを関連づけることで、ビジネスを成功させた事例があるためです。 オープンデータと皆様が持つユニークなデータを結びつける事で、何か新しい発見があるかもしれません。

1.6. ソースコード

 今回のソースコードは、githubで掲載しています。

1.7. 実行手順

1.7.1. CSVからmsgpackへの変換スクリプトの利用

 作成したスクリプトを起動し、スクリプトが正常に動作すると、aed.csv.msgpack.gzというファイルが生成されます。

ruby convert_csv_to_msgpack.rb -i aed.csv

1.7.2. TD (Treasure Data)へのmsgpackのインポート

 スクリプトによって生成されたmsgpackを以下のコマンドを用いてTDへインポートします。 TDについては、前回までの記事で導入できていることとします。 --auto-create-tableをつけることで、テーブルを用意していない場合でも自動で生成することが可能です。 -t time では、基準となる時刻カラムを指定しています。

td table:import (db_name) (table_name) --msgpack -t time aed.csv.msgpack.gz --auto-create-table

1.7.3. TDのデータの確認

 以下のコマンドを実行する事でselect文が発行されますので、データの確認をすることができます。 また、-wをつけることで、jobが完了して表示される状態まで待つことができます。

td query -w -d (db_name) "select * from (table_name) limit 2"
上記コマンドで内容の確認ができます(住所情報が含まれますのでここでは割愛いたします)

2. 終わりに

 以上、簡単にできてしまいましたね! 今回は、csvからmsgpackへの変換プログラムを紹介しました。 この調子で皆さんの持っているcsvファイルをどんどんTDへアップロードして行ってみましょう!

髙橋達