さくらVPSでCassandra 0.7のget_range_slicesを利用する
今まで下記のページで一通りのデータ取得を試して見ました。
まだ利用したことが無いget_range_slicesを試したいとおもいます。*1
get_range_slicesメソッドを利用する
org.apache.cassandra.thrift.KeyRangeクラスで範囲指定ができるようです。
空にした場合は、条件指定がなくなります。
// ColumnParent には ColumnFamily 名または ColumnFamily/SuperColumn 名を指定 ColumnParent columnParent = new ColumnParent("Standard2"); KeyRange range = new KeyRange(); range.setStart_key(ByteBuffer.wrap("z".getBytes("UTF-8"))); range.setEnd_key(ByteBuffer.wrap("a".getBytes("UTF-8"))); // 取得数。 range.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); List<KeySlice> results = client.get_range_slices(columnParent, slicePredicate, range, ConsistencyLevel.ONE); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); int i = 0; for (KeySlice keySlice : results) { String key = new String(keySlice.getKey(), "UTF-8"); System.out.println((i++) + " key = " + key); for (ColumnOrSuperColumn csc : keySlice.getColumns()) { Column col = csc.getColumn(); System.out.printf("key:[%s] [%d] カラム名:[%s] 値:[%s] タイムスタンプ:[%s]\n", key, i + 1, new String(col.getName(), "UTF8"), new String(col.getValue(), "UTF8"), sdf.format(new Date(col.timestamp))); } System.out.println("--------------------"); } port.close();
条件を変えていろいろ試すと下記のエラーがでることがあります。
InvalidRequestException(why:start key's md5 sorts after end key's md5. this is not allowed; you probably should not specify end key at all, under RandomPartitioner)
もう少しいろいろ試したいとおもいます。
*1: なんとなく動作させることはできましたが挙動がまだわかっておりません