2010-03-29 27 views
8

Suponga un almacén de datos Cassandra con 20 filas, con claves de fila llamadas "r1" .. "r20".Obteniendo claves de fila Cassandra

Preguntas:

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

  • ¿Cómo obtengo las claves de fila de las siguientes 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; 

Respuesta

8

Tome un vistazo a:

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

Donde su tupla es KeyRange (start_key, end_key) == (r1 , r10)

0

Primero debe modificar cassandra.yaml en la versión de cassandra1.1.o, donde debe configurar de la siguiente manera:

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 darse cuenta de consulta gama.

1

Según mis pruebas, no hay orden para las filas (a diferencia de las columnas). CQL 3.0.0 puede recuperar claves de fila pero no distintas (debe haber una forma en que no lo sé). En mi caso, no sé cuál es mi rango de teclas, así que traté de recuperar todas las claves con Hector y Thrift. , y ordena las llaves más tarde. La prueba de rendimiento con CQL 3.0.0 para 100000 columnas 200 filas fue de aproximadamente 500 milisegundos, Héctor alrededor de 100 y ahorrado aproximadamente 50 milisegundos. La tecla Mi fila aquí es entera. 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(); 

    } 
} 
Cuestiones relacionadas