Cassandraのはじめ方─手を動かしてNoSQLを体感しよう

第5回 APIの全体像とデータの投入

この記事を読むのに必要な時間:およそ 5.5 分

カラムを複数まとめて追加する

次は複数カラムをまとめて追加してみましょう。複数カラムをまとめて追加するにはbatch_mutateを使います。batch_mutateは以下の引数をとります。

  void batch_mutate(String keyspace,
                    Map<string, Map<string, List<Mutation>>> mutation_map,
                    ConsistencyLevel consistencyLevel)

batch_mutateでポイントとなるのは,真ん中の引数のmutation_mapです。ここにカラムファミリのキーとカラムファミリを指定して,Mutationというオブジェクトを保持する構造になっています。図2を見てください。

図2 MutationMapの構造

図2 MutationMapの構造

ここで出てくるMutationとは,挿入と削除を表現するためのオブジェクトのことです。Mutationは,カラムまたはスーパーカラムを保持する役目を持つColumnOrSuperColumnと,削除を表現するDeletionを持ちます。オブジェクト構造は図のMutationのようになっています。

では,3つのカラムをアップデートするコードをみてみましょう。以下は一部抜粋なので,全体はサンプルファイルのダウンロードからご確認ください。

この例ではhoge,foo,barというカラム3つをbatch_mutateを使って挿入しています。実際にカラムを追加している部分は,Mutationを作成しているところです。

リスト2 SimpleMultipleColumnsInsert.java

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);

スーパーカラム内のカラムを複数まとめて追加する

では最後に,スーパーカラム内のカラムを複数まとめて追加してみましょう。

やり方はカラムを複数追加するときとあまり変わりありません。唯一違うのは,SuperColumnを作成して,Columnを複数追加するところだけです。

注意していただきたいのは,SuperColumnは名前が必須になる点です。SuperColumn#setName()でスーパーカラム名を忘れず設定しましょう。ここでは"shot_profile"という名前をつけました。

リスト3 SimpleMultipleSuperColumnsInsert.java

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のデータの挿入に着目して,紹介しました。

実際に使うときは,Cassandra用のユーティリティを自前で作るなり,既存の高レベルなクライアントフレームワークなりを使うことが多くなります。ただ,プリミティブなレベルでどのようなコードになるかをイメージできるようにしておくと効率的にCassandraにアクセスできるようになるので,ひと通り知っておくといいでしょう。

なお,今回作成したサンプルプログラム全体は,以下からダウンロード可能です。

次回はデータの更新と削除について紹介します。お楽しみに。

著者プロフィール

大谷晋平(おおたにしんぺい)

オープンソースプログラマ。WebフレームワークT2の開発をしながらHadoop/NoSQLミドルウェアにも手を出す。最近ではもっぱらHadoop,Cassandra,Avro,kumofsなどに興味津々。

blog:http://d.hatena.ne.jp/shot6/

Twitter:http://twitter.com/shot6/