2012-08-06 19 views
1

檢索結果我已將數據存儲在Cassandra數據庫的ComparatorType.BYTESTYPE中。現在我想要以存儲的順序檢索數據。從Cassandra以

我在Hector中使用下面的代碼來獲取數據,但查詢結果似乎沒有排序。

Keyspace keyspace = HFactory.createKeyspace("ClusterName", cluster); 

Map<String, String> resultMap = new HashMap<String, String>(); 

SliceQuery<String, String, String> query = HFactory.createSliceQuery(keyspace, StringSerializer.get(), StringSerializer.get(), StringSerializer.get()); 
query.setColumnFamily("ColumnFamilyName").setKey("RowKey") 
.setRange("", "", false, Integer.MAX_VALUE); 
QueryResult<ColumnSlice<String, String>> result = query.execute(); 

for (HColumn<String, String> column : result.get().getColumns()) { 
     resultMap.put(column.getName(), column.getValue()); 
} 

我在想什麼?我必須使用RangeSliceQueries和OrderedRows嗎?

在此先感謝。

回答

1

這一切都取決於您爲列名設置的比較器。 如果它是BytesType(cassandra的默認值),那麼它將不會是您期望的順序。

如果你想按字母順序排列,你應該用類似的東西定義表

卡桑德拉 - CLI:

創建列家庭ColumnFamilyName與比較= UTF8Type;

,或者你還來得及,也許做

更新列族ColumnFamilyName與比較= UTF8Type;

0

謝謝你的回答。

但我解決了它通過將集合更改爲LinkedHashMap而不是HashMap。正如我注意到

result.get().getColumns() 

按順序給出的結果,但作爲HasMap不保留插入順序,結果得到無序。 因此,當您將HashMap更改爲LinkedHashMap時,上述代碼正常工作。

Map<String, String> resultMap = new LinkedHashMap<String, String>(); 
+0

看起來您的解決方案在您的情況下效果很好,但我認爲這只是插入順序和數據類型的巧合。通過一切手段保持你提出的解決方案,但我一般會採用le douard的解決方案。 – 2012-09-01 22:27:58