Question

Supposons un magasin de données Cassandra avec 20 lignes, avec des touches de ligne nommés "r1" .. "r20".

Questions:

  • Comment récupérer les clés de ligne des dix premières lignes (de r1 à r10)?

  • Comment récupérer les clés de ligne des dix prochaines lignes (de r11 à r20)?

Je cherche l'analogie Cassandra à:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
Était-ce utile?

La solution

Jetez un oeil à:

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

Si votre tuple KeyRange est (start_key, end_key) == (r1, r10)

Autres conseils

D'après mes tests, il n'y a aucun ordre pour les lignes (contrairement à colonnes). CQL 3.0.0 peut récupérer les clés de ligne mais pas distincte (il devrait y avoir une façon que je ne sais pas) .I mon cas, je ne sais pas ce que ma tessiture est, donc j'ai essayé de récupérer toutes les clés à la fois Hector et Thrift et trier les clés plus tard. Le test de performance avec CQL 3.0.0 pour 100000 colonnes 200 lignes était d'environ 500 millisecondes, Hector et environ 100 Thrift environ 50 millisecondes. Ma clé de ligne est un entier ici. Code Hector suit:

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);
    }
}

Voici le code 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();

    }
}

Vous devez tout d'abord modifier cassandra.yaml dans la version de cassandra1.1.o, où vous devez définir comme suit:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner

En second lieu, vous devez définir comme suit:

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
    }
  ];

Enfin, vous pouvez insérer des données dans et cassandra pouvez réaliser la requête de gamme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top