share facebook facebook2 twitter menu hatena pocket slack

2013.03.11 MON

Cassandraってなんじゃ?(CQL)

三浦 悟

WRITTEN BY三浦 悟

Cassandraには、CQLというSQLライクに問い合わせるインターフェースが用意されています。
これまでのスクリプトのような問い合わせよりも多くの人に馴染みやすいと思います。

○CQLコンソール

CQLのインターフェースは、これまでのcassandra-cliとは別に、binディレクトリにあるcqlshコマンドを使用します。
それではまず、helpを見てみます。


# /usr/local/cassandra/bin/cqlsh --help
Usage: cqlsh [options] [host [port]]

CQL Shell for Apache Cassandra

Options:
--version show program's version number and exit
-h, --help show this help message and exit
-C, --color Always use color output
--no-color Never use color output
-u USERNAME, --username=USERNAME
Authenticate as user.
-p PASSWORD, --password=PASSWORD
Authenticate using password.
-k KEYSPACE, --keyspace=KEYSPACE
Authenticate to the given keyspace.
-f FILE, --file=FILE Execute commands from FILE, then exit
-t TRANSPORT_FACTORY, --transport-factory=TRANSPORT_FACTORY
Use the provided Thrift transport factory function.
--debug Show additional debugging information
--cqlversion=CQLVERSION
Specify a particular CQL version (default: 3).
Examples: "2", "3.0.0-beta1"
-2, --cql2 Shortcut notation for --cqlversion=2
-3, --cql3 Shortcut notation for --cqlversion=3

Connects to localhost:9160 by default. These defaults can be changed by
setting $CQLSH_HOST and/or $CQLSH_PORT. When a host (and optional port number)
are given on the command line, they take precedence over any defaults.

-2や-3とオプションを渡すと、指定されたバージョンのCQLを使用します。
ここでは、バージョン2を指定してみます。


# /usr/local/cassandra/bin/cqlsh -2

Connected to Memorycraft Cluster at localhost:9160.
[cqlsh 2.3.0 | Cassandra 0.0.0 | CQL spec 2.0.0 | Thrift protocol 19.35.0]
Use HELP for help.
cqlsh>

このように、SQLクライアントのようなコンソールが開始されます。
コンソール上でもう一度helpを打ってみます。


cqlsh:Hogebook> help

Documented shell commands:
===========================
ASSUME CONSISTENCY DESC EXIT SHOW TRACING
CAPTURE COPY DESCRIBE HELP SOURCE

CQL help topics:
================
ALTER CREATE_KEYSPACE SELECT_EXPR
ALTER_ADD CREATE_TABLE SELECT_LIMIT
ALTER_ALTER CREATE_TABLE_OPTIONS SELECT_TABLE
ALTER_DROP CREATE_TABLE_TYPES SELECT_WHERE
ALTER_WITH DELETE TEXT_OUTPUT
APPLY DELETE_COLUMNS TIMESTAMP_INPUT
ASCII_OUTPUT DELETE_USING TIMESTAMP_OUTPUT
BEGIN DELETE_WHERE TRUNCATE
BLOB_INPUT DROP TYPES
BOOLEAN_INPUT DROP_COLUMNFAMILY UPDATE
CONSISTENCYLEVEL DROP_INDEX UPDATE_COUNTERS
CREATE DROP_KEYSPACE UPDATE_SET
CREATE_COLUMNFAMILY DROP_TABLE UPDATE_USING
CREATE_COLUMNFAMILY_OPTIONS INSERT UPDATE_WHERE
CREATE_COLUMNFAMILY_TYPES SELECT USE
CREATE_INDEX SELECT_COLUMNFAMILY UUID_INPUT

さらに、各コマンドでhelpを打つと詳細が分かります。


cqlsh:Hogebook> help SELECT

SELECT [FIRST n] [REVERSED]
FROM [.]
[USING CONSISTENCY ]
[WHERE ]
[ORDER BY [DESC]]
[LIMIT m];

SELECT is used to read one or more records from a CQL table. It returns
a set of rows matching the selection criteria specified.


Note that FIRST and REVERSED are only supported in CQL 2, and ORDER BY
is only supported in CQL 3 and higher.

For more information, see one of the following:

HELP SELECT_EXPR
HELP SELECT_TABLE
HELP SELECT_WHERE
HELP SELECT_LIMIT
HELP CONSISTENCYLEVEL

このように、とてもSQLライクに使えるようです。
いくつかコマンドを打ってみたいと思います。

○DESC TABLE


cqlsh:Hogebook> desc table User;

CREATE TABLE User (
KEY text PRIMARY KEY,
email text,
gender text
) WITH
comment='' AND
comparator=text AND
read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
default_validation=text AND
min_compaction_threshold=4 AND
max_compaction_threshold=32 AND
replicate_on_write='true' AND
compaction_strategy_class='SizeTieredCompactionStrategy' AND
compression_parameters:sstable_compression='SnappyCompressor';

CREATE INDEX User_gender_idx ON User (gender);

○SELECT


cqlsh:Hogebook> select * from User;

KEY | email | gender
-----------------+----------------------------+--------
memorycraft | memorycraft@gmail.com | male
memorycraftgirl | memorycraft+girl@gmail.com | female

○INSERT


cqlsh:Hogebook> insert into User(KEY, email, gender) VALUES('hellocql', 'memorycraft+cql@gmail.com', 'male');
cqlsh:Hogebook>
cqlsh:Hogebook> select * from User;

KEY | email | gender
-----------------+----------------------------+--------
memorycraft | memorycraft@gmail.com | male
hellocql | memorycraft+cql@gmail.com | male
memorycraftgirl | memorycraft+girl@gmail.com | female

上記なら、違和感なくデータの操作や参照ができそうです。

○APIアクセス

これらのCQLコマンドはコンソール上でも使用しますが、アプリケーションコードからも発行できます。
以前の記事「Cassandraってなんじゃ?(API編) 」で使用したphpcasaからも使うことができます。

例えば、以下はテーブルの全データを取得して出力するスクリプトになります。


//ライブラリのロード
require_once __DIR__."/lib/autoload.php";

//コネクションプールの使用
use phpcassaConnectionConnectionPool;
$pool = new ConnectionPool("Hogebook", array("10.0.1.10"));

//接続の取得
$raw = $pool->get();

//CQLクエリの発行
$rows = $raw->client->execute_cql_query("SELECT * FROM User", 2);

//結果の取得
$pool->return_connection($raw);
unset($raw);

//接続の解除
$pool->close();

//結果の表示
print_r($rows);

このスクリプトを実行してみます。


$ php ./cql.php
cassandraCqlResult Object
(
[type] => 1
[rows] => Array
(
[0] => cassandraCqlRow Object
(
[key] => memorycraft
[columns] => Array
(
[0] => cassandraColumn Object
(
[name] => KEY
[value] => memorycraft
[timestamp] => -1
[ttl] =>
)

[1] => cassandraColumn Object
(
[name] => email
[value] => memorycraft@gmail.com
[timestamp] => 1589299048
[ttl] =>
)

[2] => cassandraColumn Object
(
[name] => gender
[value] => male
[timestamp] => 1596347048
[ttl] =>
)

)

)

[1] => cassandraCqlRow Object
(
[key] => hellocql
[columns] => Array
(
[0] => cassandraColumn Object
(
[name] => KEY
[value] => hellocql
[timestamp] => -1
[ttl] =>
)

[1] => cassandraColumn Object
(
[name] => email
[value] => memorycraft+cql@gmail.com
[timestamp] => 1562593385
[ttl] =>
)

[2] => cassandraColumn Object
(
[name] => gender
[value] => male
[timestamp] => 1562593384
[ttl] =>
)

)

)

[2] => cassandraCqlRow Object
(
[key] => memorycraftgirl
[columns] => Array
(
[0] => cassandraColumn Object
(
[name] => KEY
[value] => memorycraftgirl
[timestamp] => -1
[ttl] =>
)

[1] => cassandraColumn Object
(
[name] => email
[value] => memorycraft+girl@gmail.com
[timestamp] => 1611666048
[ttl] =>
)

[2] => cassandraColumn Object
(
[name] => gender
[value] => female
[timestamp] => 1602906048
[ttl] =>
)

)

)

)

[num] =>
[schema] => cassandraCqlMetadata Object
(
[name_types] => Array
(
[KEY] => AsciiType
)

[value_types] => Array
(
[KEY] => UTF8Type
[email] => UTF8Type
[gender] => UTF8Type
)

[default_name_type] => UTF8Type
[default_value_type] => UTF8Type
)

)

出力を見ると、オブジェクト形式で結果が返ってくるようです。
これならば、普段のSQLと近い感覚でコードが書けるため、移行もしやすいと思います。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

presented by