前回はCassandraへデータを投入する方法を説明しました。今回はデータの更新と削除についてご説明します。
データ更新ではタイムスタンプに注意
Cassandraにおけるデータ更新は,
以下のコードでそれを確かめてみましょう。
リスト1 SimpleUpdate
Date oldDate = new SimpleDateFormat("yyyy/MM/dd").parse("1970/01/01");
long oldTimestamp = oldDate.getTime();
Cassandra.Client client = new Cassandra.Client(protocol);
try {
final String key = "sample_update1";
final String columnName = "update_hoge";
String value = "original_value";
long timestamp = System.currentTimeMillis();
final ColumnPath columnPath = new ColumnPath(COLUMN_FAMILY);
columnPath.setColumn(columnName.getBytes());
// 1件カラムをインサート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
value = "update_value";
timestamp = System.currentTimeMillis();
// 同一カラムを更新日付を後にしてアップデート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
value = "update2_value";
timestamp = oldTimestamp;
// 同一カラムを更新日付を前にしてアップデート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
} catch (InvalidRequestException e) {
...
Cassandra-cliを使って確認してみてください。
cassandra> get Keyspace1.Standard1['sample_update1'] => (column=7570646174655f686f6765, value=update_value, timestamp=1277138220269) Returned 1 results.
データが更新日付が後のもので上書きされているのがわかるでしょうか。
実行してみるとわかるのですが,
batch_
1行ならremove,まとめてならbatch_mutateで削除
次はデータの削除です。データを削除するには以下の2つの方法があります。
- removeメソッド削除する
- batch_
mutateでDeletionオブジェクトをセットして削除する
1行を削除するような処理は前者で問題ありません。一方,
ではそれぞれの詳細を見ていきましょう。
removeメソッドで削除する場合の3つの選択肢
removeメソッドで削除する場合,
- ① キーで指定したロウ内のカラムを削除する
- ② キーで指定したロウ内のスーパーカラムを削除する
- ③ そのキーのロウごと削除する
これらは,
①キーで指定したロウ内のカラムを削除する
以下は特定カラムを削除するサンプルコードの抜粋です。このサンプルでは,
注目していただきたいことが2点あります。1点目は,
2点目は,
リスト2 DeleteColumnWithRemove
Date oldDate = new SimpleDateFormat("yyyy/MM/dd").parse("1970/01/01");
long oldTimestamp = oldDate.getTime();
Cassandra.Client client = new Cassandra.Client(protocol);
try {
final String key = "sample_delete1";
final String columnName = "delete_hoge";
String value = "削除のサンプルです";
long timestamp = System.currentTimeMillis();
final ColumnPath columnPath = new ColumnPath(COLUMN_FAMILY);
columnPath.setColumn(columnName.getBytes());
// 1件カラムをインサート
client.insert(KEYSPACE, key, columnPath, value.getBytes(),
timestamp, ConsistencyLevel.ONE);
// 古いタイムスタンプで削除しようとすると,削除できない.特に例外も出ない。
client.remove(KEYSPACE, key, columnPath, oldTimestamp,
ConsistencyLevel.ALL);
// 削除されていない事を確認
ColumnOrSuperColumn ret = client.get(KEYSPACE, key, columnPath,
ConsistencyLevel.ONE);
Column retColumn = ret.getColumn();
String retName = new String(retColumn.getName());
String retValue = new String(retColumn.getValue());
System.out.println("カラムキー : " + retName);
System.out.println("カラム値: " + retValue);
System.out.println("タイムスタンプ: " + retColumn.getTimestamp());
timestamp = System.currentTimeMillis();
// タイムスタンプを更新して削除.
client.remove(KEYSPACE, key, columnPath, timestamp,
ConsistencyLevel.ALL);
// 削除されていてカラムが既に無いのでNotFoundException発生
ret = client.get(KEYSPACE, key, columnPath, ConsistencyLevel.ONE);