假設一個具有20行的Cassandra數據存儲,行鍵名爲"r1"
.. "r20"
。獲取Cassandra行鍵
問題:
如何取前十行的行鍵(
r1
到r10
)?如何獲取下10行的行密鑰(
r11
至r20
)?
我在尋找卡桑德拉比喻:
SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
假設一個具有20行的Cassandra數據存儲,行鍵名爲"r1"
.. "r20"
。獲取Cassandra行鍵
問題:
如何取前十行的行鍵(r1
到r10
)?
如何獲取下10行的行密鑰(r11
至r20
)?
我在尋找卡桑德拉比喻:
SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
看看:
list<KeySlice> get_range_slices(keyspace, column_parent, predicate, range, consistency_level)
如果您KeyRange的元組是(start_key,end_key)==(R1 ,r10)
您應該首先在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
}
];
最後,您可以將數據插入到卡桑德拉和可實現範圍查詢。
根據我的測試,行沒有順序(與列不同)。 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();
}
}