EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

第3回 CQL(Cassandra Query Language)の基礎

edited by DB Online   2015/08/24 13:00

カラムの追加とデータの更新

 セカンダリーインデックスについて見てみる前に、先ほどのテーブルにセカンダリーインデックスを作成するためのカラムを追加します。

cqlsh:my_app> ALTER TABLE user ADD department varchar;
cqlsh:my_app> SELECT * FROM user;

 user_id | department | first_name | last_name
---------+------------+------------+-----------
     kei |       null |       富山 |      啓介
    mary |       null |       Mary |    Arnold

(2 rows)

 カラムが追加されています。 この新しいカラムにデータを入れるため、既存のレコードを更新しましょう。更新には UPDATE を利用します。

cqlsh:my_app> UPDATE user SET department = 'IT' WHERE user_id='kei';
cqlsh:my_app> UPDATE user SET department = 'HR' WHERE user_id='mary';
cqlsh:my_app> SELECT * FROM user;

 user_id | department | first_name | last_name
---------+------------+------------+-----------
     kei |         IT |       富山 |      啓介
    mary |         HR |       Mary |    Arnold

(2 rows)

 更新されましたね。

セカンダリーインデックス

 それでは先ほど追加したカラムにセカンダリーインデックスを作成します。 こちらもSQLと同じように CREATE INDEX を利用します。

cqlsh:my_app> CREATE INDEX department_idx ON user (department) ;
cqlsh:my_app> SELECT * FROM user WHERE department = 'IT';

 user_id | department | first_name | last_name
---------+------------+------------+-----------
     kei |         IT |       富山 |      啓介

(1 rows)
cqlsh:my_app> SELECT * FROM user WHERE department = 'HR';

 user_id | department | first_name | last_name
---------+------------+------------+-----------
    mary |         HR |       Mary |    Arnold

(1 rows)

 department カラムを条件に指定しても、以前のようにエラーが出なくなりました。

データの結合や集約は?

 見た目はSQLとほとんど同じですが、CQLにはデータの結合(JOIN)とすべてのデータをまたいだ集約(GROUP BY)の機能はありません。これは、Cassandraが複数のノードに分散して大量のデータを高速に出し入れするよう設計されているためです。 もし実装するとなると、合致するデータを集めるために多数のノードと通信を繰り返さなければなりません。そうするとデータの取得に時間がかかってしまいます。 どうしてもそういった機能が必要な場合、現在ではApache Sparkなどの外部のシステムを用いて実現するのが主流です。

データの削除

 登録したデータを削除するにはどうすればよいでしょうか。そうです。DELETE 文を利用します。

cqlsh:my_app> DELETE FROM user WHERE user_id='kei';
cqlsh:my_app> SELECT * FROM user;

 user_id | department | first_name | last_name
---------+------------+------------+-----------
    mary |         HR |       Mary |    Arnold

(1 rows)

 カラムのデータのみを削除することもできます。

cqlsh:my_app> DELETE department FROM user WHERE user_id='mary';
cqlsh:my_app> SELECT * FROM user;

 user_id | department | first_name | last_name
---------+------------+------------+-----------
    mary |       null |       Mary |    Arnold

(1 rows)
department カラムのデータのみ削除されましたね。

cqlsh:my_app> SELECT * FROM user WHERE department='HR';

 user_id | department | first_name | last_name
---------+------------+------------+-----------

(0 rows)

 紐づくセカンダリーインデックスからも削除されています。

まとめ

 CQLは非常にSQLに似た言語です。SQLに慣れ親しんでいる開発者にはすぐに開発を始められるのではないでしょうか。 次回は複合キーやコレクション型、ユーザー定義型などを用いた様々なデータモデリングについて学びます。



著者プロフィール

  • 森下雄貴(モリシタユウキ)

    DataStax社ソフトウェアデベロッパーおよびApache Cassandraコミッター。 仕事では毎日ほぼ100%、Cassandraのコードをいじっています。 Spotifyで音楽を聞きながらコードを書き、iPhoneでメールをチェックし、 オフはNetflixで映画を見たり、プレイステーション4でオンラインゲームを楽しみます。 (全部Cassandraが使われているサービスです。)

バックナンバー

連載:こんにちはCassandra!―米国でApache Cassandraを開発している日本人コミッターが教える、1から始めるCassandra
All contents copyright © 2007-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5