cassandra-cliを触ってみたので、今度はCQL(Cassandra Query Language)を使ってみます。
とりあえず、比較のためcassandra-cliで先にキースペースを作成しておきました。
[default@unknown] create keyspace DEMO ... with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' ... and strategy_options = {replication_factor:1}; 9e2f3541-c5e7-31de-95a3-98047e78a696 [default@unknown] use DEMO; Authenticated to keyspace: DEMO [default@DEMO] create clumn family Users ... with key_validation_class = 'UTF8Type' ... and comparator = 'UTF8Type' ... and default_validation_class = 'UTF8Type';
では、cqlshを起動してみます。
$ cqlsh localhost 9160 Connected to Test Cluster at localhost:9160. [cqlsh 2.3.0 | Cassandra 1.2.4 | CQL spec 3.0.0 | Thrift protocol 19.35.0] Use HELP for help. cqlsh>
先ほど、cliで作ったキースペースを使おうとしてみます。
cqlsh> USE DEMO; Bad Request: Keyspace 'demo' does not exist Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.
…怒られましたよ。そんなものないって言われます。
とりあえず、手元にある本を見ながら
Cassandra実用システムインテグレーション (NEXT-ONE)
- 作者: 中村寿一,長田伊織,谷内隼斗,藤田洋,森井幸希,岸本康二
- 出版社/メーカー: 翔泳社
- 発売日: 2013/01/16
- メディア: 大型本
- 購入: 2人 クリック: 8回
- この商品を含むブログ (3件) を見る
cqlsh> CREATE KEYSPACE CqlDemo WITH strategy_class = 'SimpleStrategy' AND strategy_options:replication_factor = 1; Bad Request: line 1:83 mismatched input ':' expecting '=' Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.
…怒られましたよ。CQL 2を使おうとしてるんじゃない?と言われているので、今使っているCQLのバージョンは、と…
cqlsh> SHOW VERSION; [cqlsh 2.3.0 | Cassandra 1.2.4 | CQL spec 3.0.0 | Thrift protocol 19.35.0]
CQL 3!
というわけで、CQL 3のドキュメントを見てみます。
http://cassandra.apache.org/doc/cql3/CQL.html
構文が、変わっている…。
気を取り直して、書き直します。
cqlsh> CREATE KEYSPACE CqlDemo ... WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
今度は、成功したようです。
USEでキースペースも選べます。
cqlsh> USE CqlDemo; cqlsh:CqlDemo>
ちなみに、この定義はcassandra-cliで確認できます。
[default@unknown] USE CqlDemo; Authenticated to keyspace: cqldemo [default@cqldemo] DESCRIBE CqlDemo; WARNING: CQL3 tables are intentionally omitted from 'describe' output. See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. Keyspace: cqldemo: Replication Strategy: org.apache.cassandra.locator.SimpleStrategy Durable Writes: true Options: [replication_factor:1] Column Families:
それでは、カラムファミリーを作成してみます。
cqlsh:CqlDemo> CREATE TABLE users ( ... id int PRIMARY KEY, ... name text, ... age int ... );
当然ながら、データはありません、と。
cqlsh:CqlDemo> SELECT COUNT(*) FROM users; count ------- 0
では、データを登録してみます。
cqlsh:CqlDemo> INSERT INTO users (id, name, age) ... VALUES (1, 'Tanaka Taro', 20); cqlsh:CqlDemo> INSERT INTO users (id, name, age) ... VALUES (2, 'Suzuki Jiro', 25);
今度は、データが確認できます。
cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+-----+------------- 1 | 20 | Tanaka Taro 2 | 25 | Suzuki Jiro
ちなみに、cassandra-cliで見ると、こんな結果になります。
[default@cqldemo] list users; Using default limit of 100 Using default column limit of 100 ------------------- RowKey: 1 => (column=, value=, timestamp=1366450720988000) => (column=age, value=00000014, timestamp=1366450720988000) => (column=name, value=54616e616b61205461726f, timestamp=1366450720988000) ------------------- RowKey: 2 => (column=, value=, timestamp=1366450741846000) => (column=age, value=00000019, timestamp=1366450741846000) => (column=name, value=53757a756b69204a69726f, timestamp=1366450741846000) 2 Rows Returned. Elapsed time: 7.05 msec(s).
なにか、知らないカラムが増えていますが…。
なお、cassandra-cliでは、CQL 3で作成したカラムファミリ(テーブル)はdescribeでは表示されないみたいです。
[default@cqldemo] describe cqldemo; WARNING: CQL3 tables are intentionally omitted from 'describe' output. See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. Keyspace: cqldemo: Replication Strategy: org.apache.cassandra.locator.SimpleStrategy Durable Writes: true Options: [replication_factor:1] Column Families:
まあ、なんか延々と警告されていますしね。警告のissueを見ると、すでにfixedだったのでそのうち直るのかな?
カラムファミリを直指定すると、一応確認できます。
[default@cqldemo] describe users; WARNING: CQL3 tables are intentionally omitted from 'describe' output. See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. ColumnFamily: users Key Validation Class: org.apache.cassandra.db.marshal.Int32Type Default column value validator: org.apache.cassandra.db.marshal.BytesType Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type) GC grace seconds: 0 Compaction min/max thresholds: 0/0 Read repair chance: 0.0 DC Local Read repair chance: 0.0 Populate IO Cache on flush: false Replicate on write: false Caching: keys_only Bloom Filter FP chance: default Built indexes: [] Compaction Strategy: null null
では、cqlshに戻りまして…
今度は、UPDATEで更新してみます。
cqlsh:CqlDemo> UPDATE users SET age = 22 ... WHERE id = 2;
UPDATEは、WHEREが必須みたいですよ。
UPDATEで、データの登録もできるらしいです。
cqlsh:CqlDemo> UPDATE users ... SET name = 'Harada Saburo', ... age = 18 ... WHERE id = 3;
ということは、INSERTでデータの更新も…
cqlsh:CqlDemo> INSERT INTO users (id, name, age) ... VALUES (3, 'Harada Saburo', 20);
できますね。
事実、そんなことが書いていますし。
INSERT
Note that unlike in SQL, INSERT does not check the prior existence of the row: the row is created if none existed before, and updated otherwise. Furthermore, there is no mean to know which of creation or update happened. In fact, the semantic of INSERT and UPDATE are identical.
UPDATE
Note that unlike in SQL, UPDATE does not check the prior existence of the row: the row is created if none existed before, and updated otherwise. Furthermore, there is no mean to know which of creation or update happened. In fact, the semantic of INSERT and UPDATE are identical.
ちなみに、INSERTもUPDATEもTTLというのが指定できて、その秒数だけ経過すると削除されるデータが登録できるみたいです。
cqlsh:CqlDemo> INSERT INTO users (id, name, age) ... VALUES (4, 'Mike', 18) ... USING TTL 10;
TTLを10と指定したので、10秒後にはSELECTの結果からいなくなります。
cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+-----+--------------- 1 | 20 | Tanaka Taro 2 | 22 | Suzuki Jiro 4 | 18 | Mike 3 | 20 | Harada Saburo cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+-----+--------------- 1 | 20 | Tanaka Taro 2 | 22 | Suzuki Jiro 3 | 20 | Harada Saburo
更新も試してみましたけど…
cqlsh:CqlDemo> UPDATE users USING TTL 10 ... SET age = 25 ... WHERE id = 3;
時間が経過したら、設定した項目がnullになりましたー!!
cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+------+--------------- 1 | 20 | Tanaka Taro 2 | 22 | Suzuki Jiro 3 | null | Harada Saburo cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+------+--------------- 1 | 20 | Tanaka Taro 2 | 22 | Suzuki Jiro 3 | null | Harada Saburo
削除。DELETEでカラム名を指定すると、そのカラムがnullになります。
cqlsh:CqlDemo> DELETE age FROM users WHERE id = 2; cqlsh:CqlDemo> SELECT * FROM users; id | age | name ----+------+--------------- 1 | 20 | Tanaka Taro 2 | null | Suzuki Jiro 3 | null | Harada Saburo
DELETEは、WHEREが必須みたいなので、全部削除するにはTRUNCATE。
cqlsh:CqlDemo> TRUNCATE users;
テーブルの削除は、DROP TABLE。
cqlsh:CqlDemo> DROP TABLE users;
キースペースの削除は、DROP KEYSPACE。
cqlsh:CqlDemo> DROP KEYSPACE CqlDemo;
それでは、さようなら。
cqlsh:CqlDemo> EXIT
*「QUIT」でも終了できます