8

"r1"..という名前の行キーを持つ、20行のCassandraデータストアを想定します"r20"

質問:

  • r1最初の10行(から)の行キーを取得するにはどうすればよいr10ですか?

  • r11次の10行(から)の行キーをフェッチするにはどうすればよいr20ですか?

私はカサンドラのアナロジーを探しています:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
4

3 に答える 3

8

を見てみましょう:

list<KeySlice> get_range_slices(keyspace, column_parent, predicate, range, consistency_level)

KeyRangeタプルは(start_key、end_key)==(r1、r10)です。

于 2010-03-29T21:13:42.967 に答える
1

私のテストに基づくと、(列とは異なり)行の順序はありません。CQL 3.0.0は行キーを取得できますが、区別できません(わからない方法があるはずです)。私の場合、キー範囲がわからないため、HectorとThriftの両方ですべてのキーを取得しようとしました。 、後でキーを並べ替えます。100000列200行のCQL3.0.0を使用したパフォーマンステストは、約500ミリ秒、Hectorは約100ミリ秒、節約は約50ミリ秒でした。ここでの私の行キーは整数です。ヘクターコードは次のとおりです。

public void qureyRowkeys(){
    myCluster = HFactory.getOrCreateCluster(CLUSTER_NAME, "127.0.0.1:9160");
    ConfigurableConsistencyLevel ccl = new ConfigurableConsistencyLevel();
    ccl.setDefaultReadConsistencyLevel(HConsistencyLevel.ONE);
    myKeyspace = HFactory.createKeyspace(KEYSPACE_NAME, myCluster, ccl);
    RangeSlicesQuery<Integer, Composite, String> rangeSlicesQuery = HFactory.createRangeSlicesQuery(myKeyspace, IntegerSerializer.get(), 
            CompositeSerializer.get(), StringSerializer.get());
    long start = System.currentTimeMillis();
    QueryResult<OrderedRows<Integer, Composite, String>> result =
      rangeSlicesQuery.setColumnFamily(CF).setKeys(0, -1).setReturnKeysOnly().execute();
    OrderedRows<Integer, Composite, String> orderedRows = result.get();
    ArrayList<Integer> list = new ArrayList<Integer>();
    for(Row<Integer, Composite, String> row: orderedRows){
        list.add(row.getKey());
    }

    System.out.println((System.currentTimeMillis()-start));
    Collections.sort(list);
    for(Integer i: list){
        System.out.println(i);
    }
}

これはThriftコードです:

public void retreiveRows(){
    try {
        transport = new TFramedTransport(new TSocket("localhost", 9160));
        TProtocol protocol = new TBinaryProtocol(transport);
        client = new Cassandra.Client(protocol);
        transport.open();
        client.set_keyspace("prefdb");
        ColumnParent columnParent = new ColumnParent("events"); 
        SlicePredicate predicate = new SlicePredicate();
        predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 1));              
        KeyRange keyRange = new KeyRange();  //Get all keys
        keyRange.setStart_key(new byte[0]);
        keyRange.setEnd_key(new byte[0]);
        long start = System.currentTimeMillis();
        List<KeySlice> keySlices = client.get_range_slices(columnParent, predicate, keyRange, ConsistencyLevel.ONE);
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (KeySlice ks : keySlices) {
                 list.add(ByteBuffer.wrap(ks.getKey()).getInt());
        }    
        Collections.sort(list);
        System.out.println((System.currentTimeMillis()-start));
        for(Integer i: list){
            System.out.println(i);
        }

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

    }
}
于 2012-06-11T22:27:54.510 に答える
0

まずcassandra.yaml、cassandra1.1.oのバージョンで変更する必要があります。ここで、次のように設定する必要があります。

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner

次に、次のように定義する必要があります。

create keyspace DEMO with placement_strategy =
  'org.apache.cassandra.locator.SimpleStrategy' and
  strategy_options = [{replication_factor:1}];

use DEMO;

create column family Users with comparator = AsciiType and
  key_validation_class = LongType and
  column_metadata = [
    {
      column_name: aaa,
      validation_class: BytesType
    },{
      column_name: bbb,
      validation_class: BytesType
    },{
      column_name: ccc,
      validation_class: BytesType
    }
  ];

最後に、cassandraにデータを挿入して、範囲クエリを実現できます。

于 2012-06-05T04:11:41.317 に答える