2010-03-29 15 views
8

Nehmen Sie einen Cassandra-Datenspeicher mit 20 Zeilen und den Zeilenschlüsseln "r1" .. "r20" an.Abrufen von Cassandra-Zeilenschlüsseln

Fragen:

  • Wie hole ich die Zeilenschlüssel der ersten zehn Zeilen (r1 zu r10)?

  • Wie hole ich die Zeilenschlüssel der nächsten zehn Zeilen (r11 bis r20)?

Ich suche die Cassandra Analogie zu:

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

Antwort

8

Werfen Sie einen Blick auf:

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

Wo Ihr KeyRange Tupel (start_key, end_key) == (r1 , r10)

0

Sie sollten zuerst cassandra.yaml in der Version von cassandra1.1.o ändern, wo Sie wie folgt festlegen sollten:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner 

Zweitens sollten Sie wie folgt definieren:

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

Schließlich können Sie Daten in cassandra einfügen und Bereichsabfrage realisieren können.

1

Basierend auf meinen Tests gibt es keine Reihenfolge für die Zeilen (im Gegensatz zu Spalten). CQL 3.0.0 kann Zeilenschlüssel abrufen, aber nicht eindeutig (es sollte einen Weg geben, den ich nicht kenne). Ich weiß nicht, was mein Schlüsselbereich ist, also habe ich versucht, alle Schlüssel mit Hector und Thrift abzurufen , und sortieren Sie die Schlüssel später. Der Leistungstest mit CQL 3.0.0 für 100000 Spalten 200 Zeilen betrug etwa 500 Millisekunden, Hector etwa 100 und Sparsamkeit etwa 50 Millisekunden. Mein Zeilenschlüssel hier ist eine Ganzzahl. Hector Code folgt:

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

Dies ist der Thrift Code:

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

    } 
}