2013-03-10 50 views
2

我想實現一個數據模型,其中行鍵是字符串,列名是長和列值是DynamicComposites。使用赫克託,存儲過程的一個例子是這樣的:如何反序列化DynamicComposite列值?

// create the value 
DynamicComposite colVal = new DynamicComposite(); 
colVal.add(0, "someString"); 
colVal.setComparatorByPosition(0, "org.apache.cassandra.db.marshal.UTF8Type"); 
colVal.setSerializerByPosition(0, StringSerializer.get()); 

// create the column 
HColumnImpl<Long, DynamicComposite> newCol = new 
    HColumnImpl<Long, DynamicComposite>(longSerializer, 
     dynamicCompositeSerializer); 

newCol.setName(longValue); 
newCol.setValue(colVal); 
newCol.setClock(keySpace.createClock()); 

// insert the new column 
Mutator<String> mutator = HFactory.createMutator(keySpace,stringSerializer); 
mutator.addInsertion("rowKey","columnFamilyName",newCol); 
mutator.execute(); 

現在,當我嘗試檢索數據:

// create the query 
SliceQuery<String,Long,DynamicComposite> sq = 
    HFactory.createSliceQuery(keySpace, stringSerializer, longSerializer, 
     dynamicCompositeSerializer); 

// set the query 
sq.setColumnFamily("columnFamilyName"); 
sq.setKey("rowKey"); 
sq.setColumnNames(longValue); 

// execute the query 
QueryResult<ColumnSlice<Long, DynamicComposite>> qr = sq.execute(); 

// get the data 
qr.get().getColumnByName(longValue).getValue(); 

或當我只是試圖讓普通輪空:

// get the data  
dynamicSerializer.fromByteBuffer(qr.get(). 
    getColumnByName(longValue).getValueBytes()); 

我碰到一個例外:

Exception in thread "main" java.lang.NullPointerException 
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191) 
    at com.google.common.collect.ImmutableClassToInstanceMap.getInstance(ImmutableClassToInstanceMap.java:147) 
    at me.prettyprint.hector.api.beans.AbstractComposite.serializerForComparator(AbstractComposite.java:321) 
    at me.prettyprint.hector.api.beans.AbstractComposite.getSerializer(AbstractComposite.java:344) 
    at me.prettyprint.hector.api.beans.AbstractComposite.deserialize(AbstractComposite.java:713) 
    at me.prettyprint.hector.api.beans.DynamicComposite.fromByteBuffer(DynamicComposite.java:25) 
    at me.prettyprint.cassandra.serializers.DynamicCompositeSerializer.fromByteBuffer(DynamicCompositeSerializer.java:35) 

據我所瞭解的所有教程所瞭解,應該可以使用DynamicComposite作爲列值。所以我想問:我做錯了什麼?從例外情況看,我只是忘了在某個地方設置一些東西。

回答

2

拉多,

它可能是由於一起選擇使用赫克託版本的番石榴庫的兼容性問題。

參見:https://github.com/hector-client/hector/pull/591

我對赫克託 - 核心1.1-1.jar,與番石榴14.0.jar組合,我得到了同樣的錯誤,你。當我將它與Guava-12.0.1.jar一起使用時,它對我來說工作正常。

+0

謝謝你的回覆。我會檢查一下。 – radovan 2013-03-27 11:42:08