すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for Cassandra - Deprecated:Cassandra データ型

最終更新日:Jan 19, 2025

他の言語と同様に、Cassandra Query Language(CQL)は、基本データ型、コレクション、およびユーザー定義データ型(UDT)を含む柔軟なデータ型のセットをサポートしています。このトピックでは、CQL がサポートするデータ型について説明します。

数値データ型

CQL でサポートされている数値データ型には、整数と浮動小数点数があります。これらの型は、Java の標準データ型に似ています。CQL は、次の数値データ型をサポートしています。

  • int: Java と同様に、32 ビット符号付き整数です。

  • bigint: Java の long と同等の 64 ビット long 整数です。

  • smallint: Java の short と同等の 16 ビット符号付き整数です。このデータ型は、Apache Cassandra 2.2 で導入されました。

  • tinyint: Java と同様に、8 ビット符号付き整数です。このデータ型は、Apache Cassandra 2.2 で導入されました。

  • varint: java.math.BigInteger と同等の可変精度符号付き整数です。

  • float: Java と同様に、32 ビット IEEE-754 浮動小数点数です。

  • double: Java と同様に、64 ビット IEEE-754 浮動小数点数です。

  • decimal: java.math.BigDecimal と同等の可変精度 10 進数です。

テキストデータ型

CQL は、テキストを表すために次のデータ型を提供します。

  • text または varchar: CQL で一般的に使用される UTF-8 エンコード文字列です。

  • ascii: ASCII 文字列です。

時間および ID データ型

  • timestamp: 時間は 64 ビット符号付き整数にエンコードできますが、通常は ISO 8601 標準をサポートするタイムスタンプを使用して読みやすさを向上させます。オペレーティングシステムのタイムゾーン構成に依存するのではなく、タイムスタンプには常にタイムゾーンを指定することをお勧めします。

  • date および time: Apache Cassandra 2.1 以前は、日付と時刻を表すために timestamp 型のみを使用していました。2.2 リリースでは、日付と時刻を個別に表すことができる date 型と time 型が導入されました。timestamp と同様に、これらの型は ISO 8601 形式をサポートしています。

  • uuid: ユニバーサル固有識別子(UUID)は 128 ビット値であり、ビットはいくつかの型のいずれかに準拠しています。最も一般的に使用されるのは、タイプ 1 とタイプ 4 として知られています。CQL uuid 型はタイプ 4 UUID であり、完全に乱数に基づいています。UUID は通常、ab7c46ac-c194-4c71-bb03-0f64986f3daa のように、ダッシュで区切られた 16 進数のシーケンスとして表されます。uuid 型は、多くの場合、代理キーとして使用されます。この型は、単独で使用することも、他の値と組み合わせて使用することもできます。UUID は長さが有限であるため、一意であることが絶対に保証されているわけではありません。CQL の uuid() 関数を使用して、タイプ 4 UUID 値を取得できます。

  • timeuuid: これは、コンピューターの MAC アドレス、システム時刻、および重複を防ぐために使用されるシーケンス番号に基づくタイプ 1 UUID です。CQL は、now()、dateOf()、unixTimestampOf() など、timeuuid 型と対話するための便利な関数をいくつか提供します。これらの便利な関数が利用できることが、timeuuid が uuid よりも頻繁に使用される傾向がある理由の 1 つです。

コレクションデータ型

コレクションデータ型は、データのコレクションを格納できます。set データ型に格納されている要素は順序付けされていませんが、CQL は要素をソート順に返します。セットには、前述のデータ型、ユーザー定義型、およびその他のコレクションを含めることができます。

次の例は、set データ型を使用してメール情報を格納する方法を示しています。

cqlsh:test_keyspace> CREATE TABLE test_user (first_name text , last_name text,emails set<text>, PRIMARY KEY (first_name)) ;
cqlsh:test_keyspace> INSERT INTO test_user (first_name, last_name,emails) VALUES ('Wu', 'Shi',{'iteblog@iteblog.com'});
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails                  | last_name
------------+-------------------------+-----------
         Wu | {'iteblog@iteblog.com'} |       Shi
(1 rows)
                

上記のステートメントでは、first_name が Wu のユーザーのメールアドレスが追加されています。別のメールアドレスを追加する場合は、次の構文を使用します。

cqlsh:test_keyspace> UPDATE test_user SET emails = emails + {'cassandra@iteblog.com' } WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails                                           | last_name
------------+--------------------------------------------------+-----------
         Wu | {'cassandra@iteblog.com', 'iteblog@iteblog.com'} |       Shi
(1 rows)
                

first_name が Wu のユーザーに 2 つのメールアドレスが追加されています。メールアドレスを削除する場合は、次の構文を使用します。

cqlsh:test_keyspace> UPDATE test_user SET emails = emails - {'cassandra@iteblog.com'} WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails                  | last_name
------------+-------------------------+-----------
         Wu | {'iteblog@iteblog.com'} |       Shi
(1 rows)
cqlsh:test_keyspace> UPDATE test_user SET emails ={} WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name
------------+--------+-----------
         Wu |   null |       Shi
(1 rows)
                

上記のステートメントでは、SET emails = emails - {'cassandra@iteblog.com'} を使用してメールリストからメールアドレスを削除し、SET emails ={} を使用してユーザーのすべてのメール情報をクリアしています。

list

list データ型には、順序付けられた要素のリストが含まれています。デフォルトでは、値は挿入順に格納されます。次の例は、電話番号などの情報を test_user テーブルに追加する方法を示しています。

cqlsh:test_keyspace> ALTER TABLE test_user ADD phone list<text>;
cqlsh:test_keyspace> UPDATE test_user SET phone = ['1311234****' ] WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name | phone
------------+--------+-----------+-----------------
         Wu |   null |       Shi | ['1311234****']
(1 rows)
                        

上記のステートメントでは、first_name が Wu のユーザーの電話番号が追加されています。別の電話番号を追加する場合は、set と同様の次の構文を使用します。

cqlsh:test_keyspace> UPDATE test_user SET phone = phone + ['1551111****' ] WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name | phone
------------+--------+-----------+--------------------------------
         Wu |   null |       Shi | ['1311234****', '1551111****']
(1 rows)
                        

出力では、新しい電話番号がリストの最後に表示されます。次のステートメントを使用して、リストの先頭に電話番号を挿入できます。

cqlsh:test_keyspace> UPDATE test_user SET phone = ['1334444****' ] + phone WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name | phone
------------+--------+-----------+-----------------------------------------------
         Wu |   null |       Shi | ['1334444****', '1311234****', '1551111****']
(1 rows)
                        

インデックスで参照すると、リスト内の個々の項目を変更できます。

cqlsh:test_keyspace> UPDATE test_user SET phone[1] = '1888888****' WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name | phone
------------+--------+-----------+-----------------------------------------------
         Wu |   null |       Shi | ['1334444****', '1888888****', '1551111****']
(1 rows)
                        

インデックスが 1 の要素が変更されています。インデックスを使用して、特定の項目を削除することもできます。

cqlsh:test_keyspace> DELETE phone[2] from test_user WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT * FROM test_user WHERE first_name = 'Wu';
 first_name | emails | last_name | phone
------------+--------+-----------+--------------------------------
         Wu |   null |       Shi | ['1334444****', '1888888****']
(1 rows)
                        

SET phone_numbers = phone_numbers - [ '1334444****' ] を使用して要素を削除することもできます。

map

map データ型には、キーと値のペアのコレクションが含まれています。キーと値は、counter 以外の型にすることができます。例:

cqlsh:test_keyspace> ALTER TABLE test_user ADD login_sessions map<timeuuid, int>;
cqlsh:test_keyspace> UPDATE test_user SET login_sessions = {now(): 13, now(): 18} WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT first_name, login_sessions FROM test_user WHERE first_name = 'Wu';
 first_name | login_sessions
------------+--------------------------------------------------------------------------------------
         Wu | {1cc61ff0-5f8b-11e9-ac3a-5336cd8118f6: 13, 1cc61ff1-5f8b-11e9-ac3a-5336cd8118f6: 18}
(1 rows)
                        

その他の単純なデータ型

  • boolean: 値は true または false です。CQL は入力値の大文字と小文字を区別しませんが、True または False の値を返します。

  • blob: バイナリラージオブジェクト(blob)は、任意のバイト配列の口語的なコンピューティング用語です。CQL blob 型は、メディアまたはその他のバイナリファイル型を格納するのに役立ちます。Cassandra は、blob 内のバイトを検証または検査しません。Cassandra では、blob は 16 進数として表されます。任意のテキストデータを blob にエンコードする場合は、textAsBlob() 関数を使用できます。

  • inet: この型は、IPv4 または IPv6 アドレスを表します。cqlsh は、10 進数、8 進数、または 16 進数の値を含むドット付きまたはドットなしの表現を含む、IPv4 アドレスを定義するためのすべての有効な形式を受け入れます。CQL は、192.168.XX.XX 形式で IP アドレスを返します。

  • counter: counter データ型は 64 ビット符号付き整数であり、その値を直接設定することはできず、増分または減分のみ可能です。counter 型にはいくつかの特別な制限があります。プライマリキーの一部として使用することはできません。counter を使用する場合は、プライマリキー以外のすべての列を counter にする必要があります。

UDT

Cassandra のデフォルトのデータ型が要件を満たしていない場合は、UDT を使用できます。たとえば、列を使用してユーザーの住所情報を格納する場合、郵便番号や番地などの情報を取得する必要があります。text 列を使用してこれらの値を格納することは、要件を満たしていない可能性があります。この場合は、UDT を定義できます。例:

cqlsh:test_keyspace> CREATE TYPE address (
                    ... street text,
                    ... city text,
                    ... state text,
                    ... zip_code int);
                        

上記のステートメントは、address データ型を定義しています。UDT のスコープは、それが定義されているキースペースによって決まります。これは、address データ型を test_keyspace でのみ使用できることを示します。DESCRIBE KEYSPACE test_keyspace を使用すると、出力に address データ型が test_keyspace の一部であることが示されます。次の例は、定義済みの address 型を使用する方法を示しています。

cqlsh:test_keyspace> ALTER TABLE test_user ADD addresses map<text, frozen<address>>;
cqlsh:test_keyspace> UPDATE test_user SET addresses = addresses + {'home': { street: 'shangdi 9', city: 'Beijing', state: 'Beijing', zip_code: 100080} } WHERE first_name = 'Wu';
cqlsh:test_keyspace> SELECT first_name, addresses FROM test_user WHERE first_name = 'Wu';
 first_name | addresses
------------+--------------------------------------------------------------------------------------
         Wu | {'home': {street: 'shangdi 9', city: 'Beijing', state: 'Beijing', zip_code: 100080}}
(1 rows)