2013-06-18 26 views
1

使用hector api從複合列讀取時遇到問題。沒有足夠的字節讀取組件0的值 - Hector複合列讀取

我列族:

create column family step_wise_stats_cc with key_validation_class = 'CompositeType(UTF8Type, UTF8Type)' and comparator = UTF8Type and default_validation_class = UTF8Type; 

數據: 行鍵:{TYPE-1,SUB-TYPE-1}
列:名1:值1

我查詢它是這樣的:

Cluster cluster = HFactory.getOrCreateCluster("cls1", "localhost:9160");; 
Keyspace keyspace = HFactory.createKeyspace("ks1",cluster);; 
Serializer se = StringSerializer.get(); 

Composite start = new Composite(); 
start.addComponent(0, "TYPE-1", ComponentEquality.EQUAL); 
start.addComponent(1, "SUB-TYPE-1", ComponentEquality.EQUAL); 
Composite end = new Composite(); 
end.addComponent(0, "TYPE-1", ComponentEquality.GREATER_THAN_EQUAL); 
start.addComponent(1, "SUB-TYPE-1", ComponentEquality.GREATER_THAN_EQUAL); 

SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, CompositeSerializer.get(), se);; 
sliceQuery.setColumnFamily("cf1"); 
sliceQuery.setKey("TYPE-1"); 
sliceQuery.setRange(start, start, false, 999); 

QueryResult<ColumnSlice<Composite, String>> qr = sliceQuery.execute(); 

但是,得到下面的異常: me.prettyprint.hector.api.exceptions.HInvalidRequestException:INVA lidRequestExc eption(爲什麼:沒有足夠的字節來讀取組件0的值)

任何幫助?

回答

0

您的行鍵是CompositeType,但您將行鍵設置爲「TYPE-1」。這就是卡桑德拉給你一個錯誤的原因。

切片查詢返回給定行的一列範圍。您需要爲行鍵指定組合,或者通過將子類型移動到列並將列設置爲組合來更改數據模型。

+0

我在這裏有點困惑複合行鍵Vs複合列。你能提供一些關於這些的好鏈接嗎? –

+0

主要區別在於您可以跨列而不是行進行範圍查詢。所以所有的查詢都需要知道整個行鍵(不管是否合成),但不需要指定精確的列。 – Richard

+0

感謝Richard,還有一個問題。在我的情況下,我有大約100個鍵(或稱TYPE)。在每種情況下,可能有數以萬計的子類型。每個子類型都會有5-6個列。我應該如何模擬我的專欄家族?提前致謝.. –

相關問題