付属の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/ | |||
@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/ | |||
@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[]で持ってるからなんだと思いますが。残念。