Java から Cassandra を使ってみる その2
Windows で Cassandra を動かしてみる
Java から Cassandra を使ってみる その1
の続きです。
データを登録してみる
前回 Cassandra に登録したデータを読み出すところまでを試してみたので、今回はデータを登録してみます。
package example.cassandra; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.ColumnPath; import org.apache.cassandra.thrift.ConsistencyLevel; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; public class CassandraWriteExample { public static void main(String[] args) { try { // Thrift を使用して Cassandra に接続 TTransport port = new TSocket("localhost", 9160); TProtocol protocol = new TBinaryProtocol(port); Cassandra.Client client = new Cassandra.Client(protocol); port.open(); // デフォルトで用意されている Keyspace と Column Family を使用する String keySpace = "Keyspace1"; String columnFamily = "Standard1"; // README.txt で使用されているサンプルの key に適当な column と value を追加する String key = "jsmith"; String columnName = "foo"; String value = "bar"; // ColumnPath の作成 ColumnPath columnPath = new ColumnPath(columnFamily); columnPath.setColumn(columnName.getBytes("UTF8")); // レコードを挿入 client.insert(keySpace, key, columnPath, value.getBytes("UTF8"), System.currentTimeMillis(), ConsistencyLevel.ONE); port.close(); } catch(Exception e){ e.printStackTrace(); } } }
org.apache.cassandra.thrift.Cassandra.Client#insert() メソッドを使用してデータを登録します。
実行後、cassandra-cli から「get Keyspace1.Standard1['jsmith']」を実行して値が登録されているかを確認してみます。
cassandra> get Keyspace1.Standard1['jsmith'] => (column=6c617374, value=Smith, timestamp=1272735425532) => (column=666f6f, value=bar, timestamp=1272735486176) => (column=6669727374, value=John, timestamp=1272642224288) => (column=616765, value=42, timestamp=1272735453051) Returned 4 results.
データが登録されたことを確認できました。
データを更新してみる
次は同じプログラムを使って値を更新してみます。
上記サンプルの value を「BAZ」に変更して実行します。
// README.txt で使用されているサンプルの key に適当な column と value を追加する String key = "jsmith"; String columnName = "foo"; String value = "BAZ"; // <= 変更
実行したら先ほどと同様に cassandra-cli から「get Keyspace1.Standard1['jsmith']」を実行して値が変更した値に更新されているかを確認します。
cassandra> get Keyspace1.Standard1['jsmith'] => (column=6c617374, value=Smith, timestamp=1272735425532) => (column=666f6f, value=BAZ, timestamp=1272735981736) => (column=6669727374, value=John, timestamp=1272642224288) => (column=616765, value=42, timestamp=1272735453051) Returned 4 results.
値が更新されている事が分かります。
※ 注意
稀に Column の timestamp がおかしくなってしまい、その事が原因かデータが上手く更新されなくなる場合があるようです。
その場合、Cassandra を一旦停止し、Disk 上のデータ保存領域である「/var/lib/cassandra」以下のファイルを削除してから Cassandra を再起動する事で直りました。
データを削除してみる
登録、更新と来たので、次はデータの削除を行ってみます。
package example.cassandra; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.ColumnPath; import org.apache.cassandra.thrift.ConsistencyLevel; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; public class CassandraRemoveExample { public static void main(String[] args) { try { // Thrift を使用して Cassandra に接続 TTransport port = new TSocket("localhost", 9160); TProtocol protocol = new TBinaryProtocol(port); Cassandra.Client client = new Cassandra.Client(protocol); port.open(); // デフォルトで用意されている Keyspace と Column Family を使用する String keySpace = "Keyspace1"; String columnFamily = "Standard1"; String key = "jsmith"; String columnName = "foo"; // ColumnPath の作成(この場合 Standard1.jsmith ColumnPath columnPath = new ColumnPath(columnFamily); columnPath.setColumn(columnName.getBytes("UTF8")); // レコードを削除 client.remove(keySpace, key, columnPath, System.currentTimeMillis(), ConsistencyLevel.ONE); port.close(); } catch(Exception e){ e.printStackTrace(); } } }
削除には、org.apache.cassandra.thrift.Cassandra.Client#remove() メソッドを使用します。
実行したら cassandra-cli で確認します。
cassandra> get Keyspace1.Standard1['jsmith'] => (column=6c617374, value=Smith, timestamp=1272735425532) => (column=6669727374, value=John, timestamp=1272642224288) => (column=616765, value=42, timestamp=1272735453051) Returned 3 results.
追加した値が削除された事が確認できました。
次回は org.apache.cassandra.thrift.Cassandra.Client#get_slice() メソッドを使ってみたいと思います。
Packt Publishing