share facebook facebook 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] <selectExpr>
          FROM [<keyspace>.]
            [USING CONSISTENCY <consistencylevel>]
            [WHERE <clause>]
            [ORDER BY <colname> [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からも使うことができます。
例えば、以下はテーブルの全データを取得して出力するスクリプトになります。

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