Pergunta

Suponha um armazenamento de dados de Cassandra com 20 linhas, com teclas de linha nomeadas "r1" .. "r20".

Perguntas:

  • Como faço para buscar as teclas de linha das dez primeiras linhas (r1 para r10)?

  • Como faço para buscar as teclas de linha das próximas dez linhas (r11 para r20)?

Estou procurando a analogia de Cassandra para:

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

Solução

Dê uma olhada em:

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

Onde sua tupla de keyrange está (start_key, end_key) == (r1, r10)

Outras dicas

Com base nos meus testes, não há ordem para as linhas (diferentemente das colunas). CQL 3.0.0 pode recuperar as teclas de linha, mas não distintas (deve haver uma maneira de não saber) .Eu meu caso, não sei qual é o meu alcance principal, então tentei recuperar todas as chaves com Hector e Thrift , e classifique as chaves mais tarde. O teste de desempenho com CQL 3.0.0 para 100000 colunas 200 linhas foi de cerca de 500 milissegundos, Hector em torno de 100 e economia cerca de 50 milissegundos. Minha chave de linha aqui é inteira. Código Hector segue -se:

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 é o código da economia:

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

    }
}

Você deve primeiro modificar cassandra.yaml Na versão do Cassandra1.1.o, onde você deve definir o seguinte:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner

Em segundo lugar, você deve definir o seguinte:

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 fim, você pode inserir dados no Cassandra e pode realizar a consulta de alcance.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top