2010-03-29 6 views
8

Supposons une banque de données Cassandra de 20 lignes, avec des clés de ligne nommées "r1" .. "r20".Récupération des clés de ligne Cassandra

Questions:

  • Comment puis-je récupérer les clés de ligne des dix premières lignes (r1 à r10)? Comment puis-je récupérer les clés de ligne des dix rangées suivantes (r11 à r20)?

Je cherche l'analogie Cassandra:

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

Répondre

8

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)

0

Vous devez d'abord modifier cassandra.yaml dans la version de cassandra1.1.o, où vous devriez 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.

1

D'après mes tests, il n'y a pas d'ordre pour les lignes (contrairement aux colonnes). CQL 3.0.0 peut récupérer les clés de la ligne mais pas distinct (il devrait y avoir un moyen que je ne connais pas) .Je ne sais pas quelle est ma gamme de clés, donc j'ai essayé de récupérer toutes les clés avec Hector et Thrift , et trier les clés plus tard. Le test de performance avec CQL 3.0.0 pour 100000 colonnes de 200 lignes était d'environ 500 millisecondes, Hector d'environ 100 et d'environ 50 millisecondes. La clé de ma ligne ici est un entier. 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); 
    } 
} 

C'est 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(); 

    } 
} 
Questions connexes