Symfoware

Symfowareについての考察blog

VoldemortにJavaから登録したThrift形式のデータをPythonで取得する

JavaからThriftを使用してオブジェクトをシリアライズ。
シリアライズしたデータを登録してみました。
Voldemortのデータにオブジェクトを登録する方法(thrift使用)

この登録したデータをPythonで取得してみます。




データ登録の仕組み



JavaからThriftを使用してオブジェクトをシリアライズ。
シリアライズしたデータを登録という流れを図にしてみました。

01_001_20100416163821.png

このように、Voldemort側では渡されたデータをそのまま登録しており、
シリアライズはクライアント側で行われます。

そのため、Pythonでデータを読み取るときには、プログラム内で
シリアライズされたデータを解いてやればよいことになります。

01_002_20100416163821.png





Pythonの雛形準備



Javaからデータを登録するときに使用したthriftファイルから、
python用の雛形を生成してやります。

■voldemort.thrift


namespace java com.fc2.blog68.symfoware.voldemort
namespace py symfoware.voldemort

struct ThriftData {
    1:string title,
    2:string details,
    3:list<string> list_sample,
}





このthriftファイルからpythonの雛形を生成するコマンドは、


thrift --gen py voldemort.thrift



これで、gen-pyというディレクトリが出来ると思いますので、
これから作成するプログラムと同じ階層にコピーしておきます。






Pythonのサンプルプログラム



Debian + VoldemortにWindows + Pythonで接続する
まずは、ここでやったようにProtocol BuffersのPythonモジュールのインストールと、
voldemort.py
voldemort_client_pb2.py
のコピーを行っておきます。

ソースはこんな感じになりました。


# -*- coding:utf-8 -*-

import logging
import time

#Voldemortアクセス用
from voldemort import StoreClient

#Thriftを使用するため
from thrift.protocol import TBinaryProtocol
from thrift.transport import TTransport

#symfoware.thriftから生成したモジュール
import sys
sys.path.append('./gen-py')
from symfoware.voldemort.ttypes import ThriftData

if __name__ == '__main__':
    
    logging.basicConfig(level=logging.INFO,)
    
    #StoreClientを生成
    s = StoreClient('test', [('192.168.1.250', 6666)])
    
    #Javaで登録したデータを検索
    r = s.get("key")[0]
    
    #値を取得
    value = r[0]
    version =r[1]
    
    #thriftオブジェクトへの変換準備
    buf = TTransport.TMemoryBuffer(value)
    protocol = TBinaryProtocol.TBinaryProtocol(buf)
    
    #readメソッドでオブジェクトの内容を復元
    td = ThriftData()
    td.read(protocol)
    
    #取得した値を表示
    print '[[value]]'
    print unicode(td.title, 'utf-8')
    print unicode(td.details, 'utf-8')
    
    for v in td.list_sample:
        print unicode(v, 'utf-8')





TTransport.TMemoryBufferにVoldemortで取得したデータをぶち込み、
ThriftData().read()でオブジェクトに反映させます。


実行してみると・・・


C:\src\python\voldemort>python test.py
[[value]]
日本語タイトルを設定
日本語の詳細を設定してみます。
その1
その2
その3



上手く読み込めました。






関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2010/04/25(日) 12:11:43|
  2. Voldemort
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<VoldemortにPythonから登録したThrift形式のデータをJavaで取得する | ホーム | Debian + VoldemortにWindows + Pythonで接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/388-eb6ae44a
この記事にトラックバックする(FC2ブログユーザー)