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