matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

付属のCLIツールでデータ操作

前回のエントリでKeyspaceとColumnFamilyは作れたので、あとはそこにデータを入れてみます。プログラムで実装して入れてもいいけど、まずはお手軽に付属されているCLIツールを使ってみる。
ちなみに、2010年6月14日時点でgitから取得できるソースは不具合があって、CLIツールがまともに動きません。SVNからチェックアウトしたものなら今のところ大丈夫です。

【2010/07/18 更新】
KeyとColumnの位置付けを勘違いしてたので全部見直しました!前のエントリではKeyとColumnを逆に考えちゃっていました。申し訳ないです。m(_ _)m

CLIツールの起動と操作

CLIツールはbin/cassandra-cliで起動できます。

$ ./cassandra-cli 
Welcome to cassandra CLI.

Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
[default@unknown] 

?かhelpでコマンドの説明が表示されます。

コマンド 説明 説明(訳)
? Same as help. ヘルプ表示
help Display this help. ヘルプ表示
connect <hostname>/<port> Connect to thrift service. cassandraに接続
use <keyspace> Switch to a specific keyspace. Keyspaceの切り替え
use <keyspace> <username> 'password' Switch to privileged keyspace. 権限が必要なKeyspaceの切り替え
describe keyspace <keyspacename> Describe keyspace. Keyspaceの構成表示
exit Exit CLI. CLIツールの終了
quit Exit CLI. CLIツールの終了
show cluster name Display cluster name. クラスタ名の表示
show keyspaces Show list of keyspaces. Keyspaceの一覧表示
show api version Show server API version. APIバージョンの表示
get <cf>['<key>'] Get a slice of columns. Columnの一覧を取得
get <cf>['<key>']['<super>'] Get a slice of sub columns. Columnの一覧を取得(SuperColumn利用時)
get <cf>['<key>']['<col>'] Get a column value. Columnの値を取得
get <cf>['<key>']['<super>']['<col>'] Get a sub column value. Columnの値を取得(SuperColumn利用時)
set <cf>['<key>']['<col>'] = '<value>' Set a column. Columnをセット
set <cf>['<key>']['<super>']['<col>'] = '<value>' Set a sub column. Columnをセット(SuperColumn利用時)
del <cf>['<key>'] Delete record. レコードを削除
del <cf>['<key>']['<col>'] Delete column. Columnを削除
del <cf>['<key>']['<super>']['<col>'] Delete sub column. Columnを削除(SuperColumn利用時)
count <cf>['<key>'] Count columns in record. レコード内のColumn数を取得
count <cf>['<key>']['<super>'] Count columns in a super column. レコード内のColumn数を取得(SuperColumn利用時)

KeyspaceとColumnFamilyの確認

まずは以下のコマンドでCassandraに接続。

[default@unknown] connect localhost/9160
Connected to: "Test Cluster" on localhost/9160
[default@unknown] 

利用可能なKeyspaceを表示してみると

[default@unknown] show keyspaces
Keyspace1
system
[default@unknown] 

システムで利用しているKeyspaceの"system"と、前回作成した"Keyspace1"があるはず。
以下のコマンドで対象のKeyspaceを指定します。

[default@unknown] use Keyspace1
Authenticated to keyspace: Keyspace1
[default@Keyspace1] 

これでプロンプトに現在利用対象となっているKeyspace(ここではKeyspace1)が表示されます。

Keyspaceの中にどんなColumnFamilyがあるのか、以下のコマンドで確認します。

[default@Keyspace1] describe keyspace Keyspace1

Column Family Type: Standard
Column Sorted By: org.apache.cassandra.db.marshal.UTF8Type
flush period: null minutes
------

お、前回作成したColumnFamilyが表示されまし・・・た?なぜかColumnFamilyの名前は表示されてない。。。ま、まあ型で判断する限り合ってるはずw

データ操作

そしたら実際にデータを操作してみましょ。まずはSET。

[default@Keyspace1] set STD_UTF8['matsukaz']['name'] = 'matsukaz'
Value inserted.
[default@Keyspace1] set STD_UTF8['matsukaz']['blog'] = 'http://d.hatena.ne.jp/matsukaz/'
Value inserted.
[default@Keyspace1] set STD_UTF8['matsukaz']['twitter'] = '@matsukaz'
Value inserted.

GETで内容を確認。

[default@Keyspace1] get STD_UTF8['matsukaz']['name']
=> (column=name, value=matsukaz, timestamp=1276534340978000)
[default@Keyspace1] get STD_UTF8['matsukaz']['blog']
=> (column=blog, value=http://d.hatena.ne.jp/matsukaz/, timestamp=1276534177033000)
[default@Keyspace1] get STD_UTF8['matsukaz']['twitter']
=> (column=twitter, value=@matsukaz, timestamp=1276534220295000)

おおっ、ばっちり入ってます!データを表っぽく表現すると以下な感じ。

Keyspace ColumnFamily Key Column Value
Keyspace1 STD_UTF8 matsukaz name matsukaz
blog http://d.hatena.ne.jp/matsukaz/
twitter @matsukaz

もうちょいデータを投入してみます。

[default@Keyspace1] set STD_UTF8['hoge']['name'] = 'hoge'
Value inserted.
[default@Keyspace1] set STD_UTF8['hoge']['age'] = '20'
Value inserted.

この時点のデータは

Keyspace ColumnFamily Key Column Value
Keyspace1 STD_UTF8 matsukaz name matsukaz
blog http://d.hatena.ne.jp/matsukaz/
twitter @matsukaz
hoge name hoge
age 20

という感じ。ここでのポイントは、Keyに対してColumnが自由に決められる点。"matsukaz"に対しては"name"、"blog"、"twitter"ってColumnがあるけど、"hoge"に対しては"name"以外はなくて、逆に"age"が追加されてます。

違った形でGETもしてみると、

[default@Keyspace1] get STD_UTF8['matsukaz']
=> (column=name, value=matsukaz, timestamp=1276534340978000)
=> (column=blog, value=http://d.hatena.ne.jp/matsukaz/, timestamp=1276534177033000)
=> (column=twitter, value=@matsukaz, timestamp=1276534220295000)
Returned 3 results.
[default@Keyspace1] get STD_UTF8['hoge']
=> (column=name, value=hoge, timestamp=1276534439981000)
=> (column=age, value=17, timestamp=1276534552645000)
Returned 2 results.

"matsukaz"を指定すると3行結果が返ってきたのに対して、"hoge"を指定すると2行だけ返ってきます。
Columnも一緒に指定するAPIもありますが、

[default@Keyspace1] get STD_UTF8['matsukaz']['name']
=> (column=name, value=matsukaz, timestamp=1276534340978000)

Columnだけを指定するようなAPIはありません。あくまでKeyが中心。ちなみに削除はdelで同じように指定するだけです。


Cassandra Web Consoleでは、データは以下のように表示されます。

これじゃ分からんですね。。。内部ではデータはbyte[]で持ってるからなんだと思いますが。残念。