Frage

Angenommen, einen Cassandra Datenspeicher mit 20 Zeilen, mit Zeilenschlüssel namens "r1" .. "r20".

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 zu r20)?

Ich interessiere mich für die Cassandra Analogie zu:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
War es hilfreich?

Lösung

Werfen Sie einen Blick auf:

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

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

Andere Tipps

Basierend auf meinen Tests gibt es keine Reihenfolge für die Zeilen (im Gegensatz zu Spalten). 3.0.0 CQL kann Reihe Tasten abrufen, aber nicht deutlich (es sollte ein Weg sein, dass ich nicht weiß) .Ich mein Fall weiß ich nicht, was mein Schlüsselbereich ist, so habe ich versucht, alle Schlüssel sowohl mit Hector und Thrift abrufen und sortiert 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. Meine Row Schlüssel hier ist integer. 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();

    }
}

Sie sollten zunächst cassandra.yaml in der Version von cassandra1.1.o ändern, in dem Sie festlegen wie folgt:

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 kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top