cassandraに挑戦 その3 get_slice

前回に引き続き、bin/cassandra-cliを使って
もう少し深い機能を理解してみた。

ドキュメントを読みつつ、Googleで検索しつつ
手探りで機能を体で理解していく。
まちがってる部分があるかもしれないが、
とりあえず、自分の理解を書いてみる。

まずは、

Cassandra has a data model that can most easily be thought of as a four or five dimensional hash.
cassandraは、4次元または5次元のハッシュ構造としてデータを持てる、
ということ。4次元とは、
  • 日本/東京都/世田谷区/二子玉川 = 'セレブな街'
  • 日本/東京都/世田谷区/田園調布 = 'お金持ちな街'
ということ。5次元は
  • 日本/東京都/港区/六本木/6丁目 = '六本木ヒルズがあります'
  • 日本/東京都/港区/六本木/1丁目 = '森ビルがあります'
  • 日本/東京都/港区/六本木/3丁目 = 'ほげほげがあります'
ということ、のようです。つまり、
Key = Value
の形だが、Keyが多層構造になってる、ということ。

データ構造を4次元にするか、5次元にするかなども含めて、
定義はすべて、
conf/storage-conf.xml
に書きます。

また、Keyの次元は、上から名前が付いています。4次元の場合、
  1. Keyspace
  2. Column Families
  3. Rows
  4. Column ( name and value and timestamp)
5次元の場合は、
  1. Keyspace
  2. Column Families
  3. Super Columns
  4. Rows
  5. Column ( name and value and timestamp)
という名前がそれぞれ付いています。

ここで重要なのが、Keyspace と Column Familiesは
conf/storage-conf.xmlを書き換えても、再起動をしないと
追加/変更ができない、という点です。
プロセスの起動前に定義しておかなければいけません。

逆に言うと、KeyspaceとColumn Familiesは可変ではないが、
Row と Column 随時追加可能です。好き放題データを突っ込めます。

さらに、cassandraにある機能で便利なものが、get_sliceで、
以下のようなデータの取得ができます。
cassandra> set Keyspace1.Standard1['book1']['title'] = 'dragon ball'          
Value inserted.
cassandra> set Keyspace1.Standard1['book1']['price'] = '500yen'    
Value inserted.
cassandra> get Keyspace1.Standard1['book1']                   
=> (column=title, value=dragon ball, timestamp=1267713708356)
=> (column=price, value=500yen, timestamp=1267713720682)
Returned 2 results.
book1/title = dragon ball
book1/price = 500yen
というデータに対して、
( この場合、book1がrow、
title/priceがcolumn name、
dragon ball/priceが column value )
通常のKVSなら、book1/titleとbook1/priceの両方の値を欲しいときは
それぞれ1回ずつ合計2回問い合わせてすべてのcolumn valuesを
取得するしか方法がないが、cassandraの場合、
book1を指定するだけで、それにぶら下がるものすべてを
1回で取得できるようになっている。

これは便利。なぜなら、1回の問い合わせで取得できるのはもちろんのこと、
book1以下にどのようなKEYがぶらさがっているかを知らない場合も
値をすべて取得できるから。

さらに5次元のハッシュの場合、便利さは際立って、
cassandra> set Keyspace1.Super1['store1']['item1']['price'] = '100'
Value inserted.
cassandra> set Keyspace1.Super1['store1']['item1']['title'] = 'ipod'
Value inserted.
cassandra> set Keyspace1.Super1['store1']['item2']['price'] = '200'
Value inserted.
cassandra> set Keyspace1.Super1['store1']['item2']['title'] = 'sony walkman'
Value inserted.
cassandra> set Keyspace1.Super1['store2']['item1']['price'] = '1000'       
Value inserted.
cassandra> set Keyspace1.Super1['store2']['item1']['title'] = 'manga'      
Value inserted.
cassandra> set Keyspace1.Super1['store2']['item2']['price'] = '2000'       
Value inserted.
cassandra> set Keyspace1.Super1['store2']['item2']['title'] = 'cake'       
Value inserted.
というデータを入れたときに、
cassandra> get Keyspace1.Super1['store2']                          
=> (super_column=item2,
     (column=price, value=2000, timestamp=1267714355659)
     (column=title, value=cake, timestamp=1267714368210))
=> (super_column=item1,
     (column=price, value=1000, timestamp=1267714336347)
     (column=title, value=manga, timestamp=1267714346761))
Returned 2 results.
↑これでstore2に含まれる商品とその情報を一発で取得できるし、
cassandra> get Keyspace1.Super1['store2']['item2']
=> (column=title, value=cake, timestamp=1267714368210)
=> (column=price, value=2000, timestamp=1267714355659)
Returned 2 results.
↑これでstore2/item2の商品情報を一発で取得することもできる。

cassandraは、単純なKVSよりも高機能であることがわかった。

こんなに高機能でありながら、高速に動作してくれるらしいので
今後は性能について調べて見ようと思う。