akishin999の日記

調べた事などを書いて行きます。

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() メソッドを使ってみたいと思います。