2012-06-19 18 views
1

我有一個cassandra db和具有TimeUUIDType比較器的列系列。我使用Hector並使用RandomPartitioner具有密鑰空間。TimeUUID列上的切片查詢

我想進行切片查詢以獲得由TimeUUID排序的可分頁結果。

SliceQuery<String, UUID, UserLike> query = HFactory.createSliceQuery(getKeyspace(), StringSerializer.get(), TimeUUIDSerializer.get(), UserLikesSerializer.get()); 
query = query.setKey(username); 
query.setColumnFamily(SOME_CF); 

當我配置與此代碼查詢:

query.setRange(new UUID(UUIDGen.createTime(Long.MAX_VALUE),UUIDGen.getClockSeqAndNode()), null, true, maxResults); 

我不正確的序列(可能是因爲我使用RandomPartitioner - 正確的嗎?)檢索數據 當我配置與此代碼的查詢:

query.setRange(new UUID(UUIDGen.createTime(Long.MAX_VALUE),UUIDGen.getClockSeqAndNode()), new UUID(UUIDGen.createTime(0),UUIDGen.getClockSeqAndNode()), true, maxResults); 

我得到一個錯誤:

InvalidRequestException(why:range finish must come after start in the order of traversal) 
at me.prettyprint.hector.api.exceptions.HInvalidRequestException 

任何想法?

回答

1

首先,您看到此錯誤,因爲您需要使用getTimeUUIDBytes而不是new UUID;後者只是在你給予的兩個長期中構成一個uuid,而這兩個長度本身都不是「時間戳」。所以:

query.setRange(UUIDGen.getUUID(UUIDGen.getTimeUUIDBytes(Long.MAX_VALUE)), null, true, maxResults); 

更一般地,你可以傳遞null,null作爲範圍的開始/結束的時候,你只需要說「給我結果的第一頁」,而不必擔心這一點。

+0

不完全。是時間跨度問題(我的意思是價值Long.MAX_VALUE)。我用System.currentTimeInMillis()替換它,現在它就像一個魅力 – tomekkup

1

此錯誤是因爲開始範圍大於您使用的查詢中的結束範圍值。