akishin999の日記

調べた事などを書いて行きます。

Ruby から Cassandra を使ってみる その4


Ruby の Cassandra ライブラリから、 SuperColumn を使ってみました。

SuperColumn


スーパーカラムとは、通常のカラムを値に持つカラムです。
スーパーカラム名がキー、通常のカラムが値のマップのようなイメージのデータ構造で、通常のカラムをグルーピングする事ができます。


スーパーカラムを使うには、storage-conf.xml で事前にスーパーカラムを使用する ColumnFamily であるという事を定義しておく必要があります。
storage-conf.xml でもサンプルとして Keyspace1 内に、以下のように SuperColumn が定義されています。

  • storage-conf.xml
<ColumnFamily Name="Super1"
              ColumnType="Super"
              CompareWith="BytesType"
              CompareSubcolumnsWith="BytesType" />
<ColumnFamily Name="Super2"
              ColumnType="Super"
              CompareWith="UTF8Type"
              CompareSubcolumnsWith="UTF8Type"
              RowsCached="10000"
              KeysCached="50%"
              Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>


SuperColumn を使った場合の行のイメージは以下のようになります。

 set Keyspace1.Super1['jsmith']['name']['first'] = 'John'
      │         │      │        │     │          │
      │         │      └ key    │     │          └ value
      │         │                │     └ column
      └ keyspace│                │
                 └ column family  └ super column


この時、スーパーカラムである name は、通常のカラムと同じく実行時に自由に定義可能です。
また、スーパーカラムを使用するとして定義した ColumnFamily に対して、スーパーカラムを使用しなくても特に問題はありません。

使ってみる


それでは、以下のようなコードを実行して、実際に SuperColumn の動作を確認してみます。

require 'rubygems'
require 'cassandra'
include Cassandra::Constants

client = Cassandra.new('Keyspace1', '127.0.0.1:9160')

# SuperColumn として name を指定
client.insert(:Super1, 'foo', { 'name' => {'first' => 'bar', 'last' => 'baz'} } )
# SuperColumn はあってもなくても可
client.insert(:Super1, 'foo', { 'age' => '99' } )

# key だけを指定して取得
p client.get(:Super1, 'foo')
# SuperColumn を指定して取得
p client.get(:Super1, 'foo', 'name')
# SuperColumn を指定して get_columns 呼び出し
p client.get_columns(:Super1, 'foo', ['name'])


実行結果は以下のようになります。

#<OrderedHash {"name"=>#<OrderedHash {"last"=>"baz", "first"=>"bar"}>, "age"=>#<OrderedHash {"99"=>""}>, "attr"=>#<OrderedHash {"age"=>"99"}>}>
#<OrderedHash {"last"=>"baz", "first"=>"bar"}>
[#<OrderedHash {"last"=>"baz", "first"=>"bar"}>]

参考


SuperColumn に関してはなかなか実際の利用イメージが沸きませんでしたが、以下のサイトや Twitter の発言を参考にさせて頂く事で理解を深める事ができました。
ありがとうございました。


DataModel_JP - Cassandra Wiki~
http://wiki.apache.org/cassandra/DataModel_JP

WTF is a SuperColumn? An Intro to the Cassandra Data Model  Arin Sarkissian~
http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model

Cassandraメモ(Hishidama's Apache Cassandra Memo)
http://www.ne.jp/asahi/hishidama/home/tech/apache/cassandra/index.html

Twitter 上での maiha 氏の以下の発言
http://twitter.com/maiha/status/14126486937

http://twitter.com/maiha/status/14128216827

http://twitter.com/maiha/status/14128530347


Cassandra
Cassandra
posted with amazlet at 13.06.05
Eben Hewitt
オライリージャパン
売り上げランキング: 273,748