2010-03-29 4 views
8

Предположим, что хранилище данных Cassandra с 20 строками, с клавишами строк "r1" .. "r20".Извлечение ключей из строки «Кассандра»

Вопросы:

  • Как выбрать строку ключи от первых десяти строк (r1 в r10)?

  • Как получить ключи строки из следующих десяти строк (r11 до r20)?

Я ищу аналогии Кассандры к:

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

ответ

8

Взгляните:

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

Где ваш KeyRange кортеж (start_key, end_key) == (Г1 , r10)

0

Вы должны, в первую очередь, изменить cassandra.yaml в версии cassandra1.1.o, где вы должны установить следующее:

partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner 

Во-вторых, вы должны определить следующим образом:

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

Наконец, вы можете вставить данные в Кассандре и может осуществить запрос диапазона.

1

На основании моих тестов нет порядка для строк (в отличие от столбцов). CQL 3.0.0 может извлекать ключи строк, но не различные (должен быть способ, который я не знаю). В моем случае я не знаю, что такое мой диапазон ключей, поэтому я попытался извлечь все ключи как с помощью Hector, так и Thrift , и сортировать ключи позже. Тест производительности с CQL 3.0.0 для 100000 столбцов 200 строк составлял около 500 миллисекунд, Hector около 100 и бережливый около 50 миллисекунд. Мой ключ Row здесь целый. Hector код следующим образом:

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

Это код Бережливость:

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

    } 
} 
Смежные вопросы