ワンショットではあるものの大きめのデータを処理する場合、データベースに入れたらいいなぁとおもいつつも、データベースサーバ起動するのが面倒だったり create table するのが面倒だったりすることがよくあります。
そんな時は組み込み可能な DB ってことで、こんなことに使ったら怒られそうではありますが OrientDB と Groovy の組み合わせ。タイムリーにも Twitter の自分の全ツイートが取得可能となったということで抽出をかけてみました。 🙂
OrientDB Graph-Document NoSQL dbms
OrientDB is an Open Source NoSQL DBMS with both the features of Document and Graph DBMSs. It’s written in Java and it’s amazing fast: can store up to 150,000 records per second on common hardware.
#もちろん OrientDB はサーバモードもありますです。
Twitter の全ツイートダウンロードですが、「ユーザ情報」の下の方にあるリクエストボタンをクリックするとメールリンクで CSV が送られてくるようです。
とりあえず Eclipse にファイルやライブラリを配置して・・・。(./file/Tweets は OrientDB によってつくられた DB の物理ファイルです)
まずは CSV2OrientDB のローダをかきました。 TweetsLoader.groovy
import au.com.bytecode.opencsv.CSVReader import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx import com.orientechnologies.orient.core.record.impl.ODocument // define CSV header (exclude expanded_urls) def header = [ "tweet_id" ,"in_reply_to_status_id" ,"in_reply_to_user_id" ,"retweeted_status_id" ,"retweeted_status_user_id" ,"timestamp" ,"source" ,"text"] // load CSV CSVReader reader = new CSVReader(new FileReader("./file/tweets.csv")) List myEntries = reader.readAll() reader.close() // create OrientDB ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:./file/Tweets").create() // import CSV myEntries.each { ODocument doc = new ODocument("Tweet"); def index = 0 header.each { name -> doc.field(name, it[index]) index++ } doc.save() } // close OrientDB db.close();
これを実行すると .csv が “local:./file/Tweets” DB に読み込まれます。スキーマレスなので適当にロードできます。お手軽。 🙂
でもって、できたデータベースにクエリーを発行します。 Groovy が入っているつぶやきを単純に like にて。 TweetsQuery.groogy
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx import com.orientechnologies.orient.core.record.impl.ODocument import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery // open OrientDB ODatabaseDocumentTx db = new ODatabaseDocumentTx( "local:./file/Tweets").open("admin", "admin"); // query List<ODocument> result = db.query( new OSQLSynchQuery<ODocument>( "select * from Tweet where text like '%Groovy%'")); // output result.each { println it.field("text") } // close OrientDB db.close();
手抜きコード申し訳ない(笑)
という感じで実行結果です。 あとは煮るなり焼くなりできますね。
なんだか懐かしいツイートがいっぱいでてきました。。
ちなみに5万弱のレコード数でしたが、それぞれの処理は待つ暇なく終わっています。
ワンショットとはいえ、普通のサーバ型の RDBMS を使ってしまうとプロジェクトだけでアプリを管理できずポータブル性がなくなってしまいますので組み込みDBの形式は便利ですね。サーバの起動にやきもきすることもありません。
また、OrientDB はドキュメント型ということで、スキーマレスで扱えるのもこういった用途に気軽で良いです。 このソースでは手抜きしていますが、POJO へのマッピングもできますのできちんとかくこともできます。
なんだかものすごいプロダクトをこんなことに使っていいんだろうか、、とも思ってしまいますが、、使い方のひとつということでお許しを。。 🙂