2010-03-29 67 views
8

假设一个具有20行的Cassandra数据存储,行键名为"r1" .. "r20"获取Cassandra行键

问题:

  • 如何取前十行的行键(r1r10)?

  • 如何获取下10行的行密钥(r11r20)?

我在寻找卡桑德拉比喻:

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)==(R1 ,r10)

0

您应该首先在cassandra1.1.o版本中修改cassandra.yaml,您应该在其中设置如下:

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毫秒。我的行键在这里是整数。赫克托代码如下:

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

    } 
}