前回でCassandraへのアクセスするコードの基本をおさえました。今回解説するのは以下の2点です。
- CassandraのAPIの全体像
- Cassandraにデータを投入するコードの詳細
3つの分類からAPIの全体像をおさえる
第1回でもご紹介しましたが、
以下にCassandraのAPIを、
データ挿入/更新/削除のAPI
データ挿入、
メソッド名 | 説明 |
---|---|
insert | カラムファミリかスーパーカラム内に1件カラムを挿入する |
batch_ | 同一キー内のカラムやスーパーカラムを一括挿入する |
batch_ | バッチ的に複数のカラムまたはスーパーカラムを更新する |
remove | 特定行のデータまたはカラムファミリまたはスーパーカラムを指定して削除する |
データ検索系
データ検索系の中心となるのはget_
メソッド名 | 説明 | 検索結果が無い場合の挙動 |
---|---|---|
get | 特定キーからカラムまたはスーパーカラム1つを取り出す | NotFoundExceptionが発生する |
get_ | スライスされたカラムまたはスーパーカラムの集合を返す | 空のListを返す |
multiget | 複数キーに対して並列に複数getをこなす | 値のカラムまたはスーパーカラムが空のMapを返す |
multiget_ | 複数キーに対して複数のget_ | 値のカラムまたはスーパーカラムが空のMapを返す |
get_ | カラムファミリまたはスーパーカラム内のカラム数を数える | 0を返す |
get_ | キーレンジでカラムのサブセットを返す | 空の配列を返す |
get_ | キーレンジでカラムのサブセットを返す | 空の配列を返す |
認証/管理系API
認証管理系のAPIで重要なのは、
運用・
メソッド名 | 説明 |
---|---|
login | キースペースごとに認証する |
get_ | ノードやクラスタ情報をキー指定で取り出す |
get_ | ノードやクラスタ情報を取り出す |
describe_ | キースペースを取り出す |
describe_ | クラスタ名を取得する |
describe_ | Thrift APIのバージョン名を取得する |
describe_ | トークンのレンジとホストアドレスのリングを表示する |
describe_ | キースペース内のカラムファミリ名とその属性のMapを取得する |
describe_ | Hadoopの並列処理クエリ用の実験的なAPI |
カラムを1つ挿入する
では、
- insertでカラムを1つづつ入れていく
- batch_
mutateでバッチ的に一気にデータを投入する
前出の表1にはbatch_
カラムを1つ挿入するにはinsertを使います。insertは以下の引数をとります。
void insert(String keyspace,
String key,
ColumnPath column_path,
byte[] value,
long timestamp,
ConsistencyLevel consistencyLevel)
ColumnPathでデータの格納場所を、ConsistencyLevelで一貫性レベルを指定
前回の最後にご紹介したコードの抜粋を使っておさらいしておくと、
final String key = "sample1";
final String columnName = "hoge";
final String value = "sample_value";
final long timestamp = System.currentTimeMillis();
// ColumnPathは単一のカラムの位置を特定するためのクラス(後述)
final ColumnPath columnPath = new ColumnPath(COLUMN_FAMILY);
columnPath.setColumn(columnName.getBytes());
// 1件カラムをインサート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
この中で、
ColumnPath
ColumnPathはカラムファミリとカラム名を特定するためのクラスで、
カラムファミリ名 |
カラム名 |
スーパーカラム名 |

ConsistencyLevel
Cassandraでは全ての操作で、
ConsistencyLevel | 読み込み時 | 書き込み時 |
---|---|---|
ZERO | 使用不可 | 何も保障しない書き込み。非同期に実行される |
ONE | もっとも最初に読めた1ノードのデータを返す | クライアントに返すまでの間に1ノードに書き込まれることを保障する |
QUORUM | 全ノードの内、 | クライアントに返すまでの間に |
DCQUORUM | 0. | 0. |
DCQUORUMSYNC | 0. | 0. |
ALL | 全ノードから読めた場合、 | クライアントに返すまでの間にレプリケーション数だけ書き込まれる事を保障する |
ANY | 使用不可 | 1度どこかのタイミングで書き込まれる事を保障する |
注意すべき点は、
RDBMSのようなACIDでの強度な一貫性と異なり、
スーパーカラム内の1つのカラムにデータを入れる
ではサンプルコードに戻って、
スーパーカラム内のカラムにデータを入れる方法は、
- columnPath.
setSuper_ column() → スーパーカラム名を指定 - columnPath.
setColumn() → カラム名を指定
final String key = "super_sample1";
final String superColumnName = "sample1";
final String columnName = "foo";
final String value = "super_sample_value";
final long timestamp = System.currentTimeMillis();
// ColumnPathは単一のカラムの位置を特定するためのクラス
final ColumnPath columnPath = new ColumnPath(COLUMN_FAMILY);
// スーパーカラム名を指定
columnPath.setSuper_column(superColumnName.getBytes());
// カラム名を指定
columnPath.setColumn(columnName.getBytes());
// 1件カラムをインサート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
カラムを複数まとめて追加する
次は複数カラムをまとめて追加してみましょう。複数カラムをまとめて追加するにはbatch_
void batch_mutate(String keyspace,
Map<string, Map<string, List<Mutation>>> mutation_map,
ConsistencyLevel consistencyLevel)
batch_

ここで出てくるMutationとは、
では、
この例ではhoge、
final String rowkey = "sample2";
final long timestamp = System.currentTimeMillis();
// ロウキーとカラムファミリのMapを作成
Map<String, Map<String, List<Mutation>>> mutationMap = newMap();
// カラムファミリのMapを作成。キーはカラムファミリ名、値はMutationのList
Map<String, List<Mutation>> columnFamilyMap = newMap();
// インサートの場合、MutationのListにはカラムかスーパーカラムを設定する
List<Mutation> mutations = newList();
// hogeというカラムキーで"hoge_value"を追加
{
Mutation mutation = new Mutation();
ColumnOrSuperColumn csc = new ColumnOrSuperColumn()
.setColumn(new Column("hoge".getBytes(), "hoge_value
.getBytes(), timestamp));
mutation.setColumn_or_supercolumn(csc);
mutations.add(mutation);
}
// fooというカラムキーで"foo_value"を追加
{
Mutation mutation = new Mutation();
ColumnOrSuperColumn csc = new ColumnOrSuperColumn()
.setColumn(new Column("foo".getBytes(), "foo_value"
.getBytes(), timestamp));
mutation.setColumn_or_supercolumn(csc);
mutations.add(mutation);
}
// barというカラムキーで"bar_value"を追加
{
Mutation mutation = new Mutation();
ColumnOrSuperColumn csc = new ColumnOrSuperColumn()
.setColumn(new Column("bar".getBytes(), "bar_value"
.getBytes(), timestamp));
mutation.setColumn_or_supercolumn(csc);
mutations.add(mutation);
}
columnFamilyMap.put(COLUMN_FAMILY, mutations);
mutationMap.put(rowkey, columnFamilyMap);
client.batch_mutate(KEYSPACE, mutationMap, ConsistencyLevel.ALL);
スーパーカラム内のカラムを複数まとめて追加する
では最後に、
やり方はカラムを複数追加するときとあまり変わりありません。唯一違うのは、
注意していただきたいのは、
final String rowkey = "super_sample2";
final long timestamp = System.currentTimeMillis();
// ロウキーとカラムファミリのMapを作成
Map<String, Map<String, List<Mutation>>> mutationMap = newMap();
// カラムファミリのMapを作成。キーはカラムファミリ名、値はMutationのList
Map<String, List<Mutation>> columnFamilyMap = newMap();
// インサートの場合、MutationのListにはカラムかスーパーカラムを設定する
List<Mutation> mutations = newList();
// SuperColumnを作成し、Columnを幾つか足す
{
// SuperColumnを作成し、Columnを幾つか追加する
SuperColumn superColumn = new SuperColumn();
superColumn.setName("shot_profile".getBytes());
superColumn.addToColumns(new Column("name".getBytes(),
"shinpei ohtani".getBytes(), timestamp));
superColumn.addToColumns(new Column("id".getBytes(), "shot6"
.getBytes(), timestamp));
superColumn.addToColumns(new Column("job".getBytes(),
"programmer".getBytes(), timestamp));
mutations.add(new Mutation()
.setColumn_or_supercolumn(new ColumnOrSuperColumn()
.setSuper_column(superColumn)));
}
columnFamilyMap.put(COLUMN_FAMILY, mutations);
mutationMap.put(rowkey, columnFamilyMap);
client.batch_mutate(KEYSPACE, mutationMap, ConsistencyLevel.ALL);
今回はCassandraのデータの挿入に着目して、
実際に使うときは、
なお、
- サンプルファイル
(サンプルコード3点/3. 50KB)
次回はデータの更新と削除について紹介します。お楽しみに。