CLOVER🍀

That was when it all began.

続いて、CQLへ

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)

Cassandra実用システムインテグレーション (NEXT-ONE)

キースペースを作成してみましょう。

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」でも終了できます