Pregunta

Supongamos que un almacén de datos Cassandra con 20 filas, con claves de fila con nombre "r1" .. "r20".

Preguntas:

  • ¿Cómo voy a buscar las claves de fila de las primeras filas de los diez (r1 a r10)?

  • ¿Cómo voy a buscar las teclas de la fila de los próximos diez filas (r11 a r20)?

Busco la analogía a Cassandra:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
¿Fue útil?

Solución

Tome un vistazo a:

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

Cuando su tupla es KeyRange (start_key, end_key) == (R1, R10)

Otros consejos

Con base en mis pruebas no hay orden de las filas (columnas) a diferencia. 3.0.0 CQL puede recuperar teclas de la fila, pero no distinta (debe haber una manera que no sé) .I mi caso no sé lo que mi rango de teclas es, así que traté de recuperar todas las claves tanto con Héctor y Ahorro y clasificar las claves más tarde. La prueba de rendimiento con CQL 3.0.0 para 100000 columnas 200 filas fue de aproximadamente 500 milisegundos, Hector alrededor de 100 y el ahorro de 50 milisegundos. Mi llave Fila aquí es entero. hector código siguiente:

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

Este es el código de Ahorro:

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

    }
}

Se debe modificar en primer lugar cassandra.yaml en la versión de cassandra1.1.o, donde se debe establecer como sigue:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner

En segundo lugar, debe definir de la siguiente manera:

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

Por último, se puede insertar datos en Cassandra y puede realizar consulta gama.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top