akishin999の日記

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

Java から Cassandra を使ってみる その6

Windows で Cassandra を動かしてみる
Java から Cassandra を使ってみる その1
Java から Cassandra を使ってみる その2
Java から Cassandra を使ってみる その3
Java から Cassandra を使ってみる その4
Java から Cassandra を使ってみる その5


の続きです。

get_range_slices() を使ってみる


0.6 から追加された get_range_slices() メソッドのサンプルコードです。

package example.cassandra;

import java.util.Date;
import java.util.List;

import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.KeyRange;
import org.apache.cassandra.thrift.KeySlice;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
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 CassandraRangeSlicesExample {

    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 を使用する
            String keySpace = "Examples";

            // ColumnParent には ColumnFamily 名または ColumnFamily/SuperColumn 名を指定
            ColumnParent columnParent = new ColumnParent("Entries");
            
            KeyRange keyRange = new KeyRange();
            keyRange.setStart_key("");
            keyRange.setEnd_key("");
            
            // 取得数。未指定だと100?
            keyRange.setCount(1000);
            
            SliceRange sliceRange = new SliceRange();
            // 取得カラムの範囲を指定。全部取得する場合は空の byte 配列を指定
            sliceRange.setStart(new byte[0]);
            sliceRange.setFinish(new byte[0]);
            // ソート順。true : Desc、false : ASC
            sliceRange.reversed = false;
            
            SlicePredicate slicePredicate = new SlicePredicate();
            slicePredicate.setSlice_range(sliceRange);

            // get_range_slices を呼ぶ
            List<KeySlice> results = client.get_range_slices(keySpace, 
                                                             columnParent, 
                                                             slicePredicate,
                                                             keyRange,
                                                             ConsistencyLevel.ONE);
            
            System.out.printf("Result size : [%d]\n", results.size());
            for (int i =0; i < results.size(); i++) {
                KeySlice keySlice = results.get(i);
                System.out.printf("Key : [%s]\n", keySlice.getKey());
                
                List<ColumnOrSuperColumn> columns = keySlice.getColumns();
                for (int j = 0; j < columns.size(); j++) {
                    ColumnOrSuperColumn result = columns.get(j); 
                    Column col = result.column;
                    System.out.printf("[%d] カラム名:[%s] 値:[%s] タイムスタンプ:[%s]\n", 
                            j + 1,
                            new String(col.name, "UTF8"),
                            new String(col.value, "UTF8"),
                            new Date(col.timestamp));
                }
                System.out.println("--------------------");
            }

            port.close();
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}


keyRange.setCount(1000) しているので、事前にデータを入れておけば 1000 件表示されるようです。

Result size : [1000]
Key : [575]
[1] カラム名:[content] 値:[Test Content 575] タイムスタンプ:[Mon May 03 20:54:13 JST 2010]
[2] カラム名:[title] 値:[Test Title 575] タイムスタンプ:[Mon May 03 20:54:13 JST 2010]
--------------------
Key : [373]
[1] カラム名:[content] 値:[Test Content 373] タイムスタンプ:[Mon May 03 20:54:13 JST 2010]
[2] カラム名:[title] 値:[Test Title 373] タイムスタンプ:[Mon May 03 20:54:13 JST 2010]
・
・
・