初めまして、本年度サイオステクノロジー新入社員の髙橋達です。 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. 処理の流れ
- コマンドラインからの引数の取得
- csvファイルの読込み
- ヘッダーの作成
- ファイルからのcsv読み込みとhashへの変換
- 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へアップロードして行ってみましょう!