2010-03-29 20 views
8

Assumere un archivio dati Cassandra con 20 righe, con le chiavi di riga denominate "r1" .. "r20".Recupero delle chiavi di fila Cassandra

Domande:

  • Come prelevo le chiavi riga della prima dieci file (r1 a r10)?

  • Come posso recuperare i tasti di riga delle dieci righe successive (r11 a r20)?

Sto cercando l'analogia Cassandra a:

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

risposta

8

Date un'occhiata a:

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

Dove tua tupla KeyRange è (start_key, end_key) == (r1 , r10)

0

È necessario modificare innanzitutto cassandra.yaml nella versione di cassandra1.1.o, in cui è necessario impostare come segue:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner 

In secondo luogo, è necessario definire come segue:

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

Infine, è possibile inserire i dati in cassandra e può realizzare query di gamma.

1

Sulla base dei miei test non esiste un ordine per le righe (a differenza delle colonne). CQL 3.0.0 può recuperare chiavi di riga ma non distinte (dovrebbe esserci un modo che non conosco). Nel mio caso non so quale sia il mio intervallo di tasti, quindi ho provato a recuperare tutte le chiavi con Hector e Thrift e ordina le chiavi in ​​seguito. Il test delle prestazioni con CQL 3.0.0 per 100.000 colonne 200 righe era di circa 500 millisecondi, Hector circa 100 e risparmio di circa 50 millisecondi. Il mio tasto Row qui è intero. Codice Hector segue:

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

Questo è il codice 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(); 

    } 
} 
Problemi correlati