2010-03-29 95 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(); 

    } 
} 
相關問題