2012-07-03 14 views
2

/从卡桑德拉我有以下卡桑德拉模式:存储和检索的浮动[]使用赫克托

ColumnFamily: FloatArrays { 
    SCKey: SuperColumn Key (Integer) { 
     Key: FloatArray (float[]) { 
      field (String): value (String) 
     } 
    } 
} 

为了插入坚持这个模式我在赫克托创建下面的模板数据:

template = new ThriftSuperCfTemplate<Integer, FloatArray, String>(
    keyspace, "FloatArrays", IntegerSerializer.get(), 
    FloatArraySerializer.get(), StringSerializer.get()); 

向(缩小)序列化FloatArray我创建(和单元测试)自定义序列:

public class FloatArraySerializer extends AbstractSerializer<FloatArray> { 

    private static final FloatArraySerializer instance = 
     new FloatArraySerializer(); 

    public static FloatArraySerializer get() { 
     return instance; 
    } 

    @Override 
    public FloatArray fromByteBuffer(ByteBuffer buffer) { 
     buffer.rewind(); 
     FloatBuffer floatBuf = buffer.asFloatBuffer(); 
     float[] floats = new float[floatBuf.limit()]; 
     if (floatBuf.hasArray()) { 
      floats = floatBuf.array(); 
     } else { 
      floatBuf.get(floats, 0, floatBuf.limit()); 
     } 
     return new FloatArray(floats); 
    } 

    @Override 
    public ByteBuffer toByteBuffer(FloatArray theArray) { 
     float[] floats = theArray.getFloats(); 
     ByteBuffer byteBuf = ByteBuffer.allocate(4 * descriptor.length); 
     FloatBuffer floatBuf = byteBuf.asFloatBuffer(); 
     floatBuf.put(floats); 
     byteBuf.rewind(); 
     return byteBuf; 
    } 

} 

现在来了棘手的一点。存储并检索浮点数组不会返回相同的结果。实际上,数组中的元素数量并不相同。我使用的检索结果的代码如下所示:

SuperCfResult<Integer, FloatArray, String> result = 
    template.querySuperColumns(hash); 
for (FloatArray floatArray: result.getSuperColumns()) { 
    // Do something with the FloatArrays 
} 

难道我做一个概念性的错误,在这里,因为我是很新的卡桑德拉/赫克托?现在我甚至不知道哪里出了问题。串行器似乎没问题。你能否给我提供一些指示以继续我的搜索?非常感谢!

回答

1

我认为你是在正确的轨道上。当我的ByteBuffers工作,我发现我有时需要声明:

import org.apache.thrift.TBaseHelper; 

     ... 

ByteBuffer aCorrectedByteBuffer = TBaseHelper.rightSize(theByteBufferIWasGiven); 

字节缓冲区有时有其价值存储为偏移到它的缓冲区,但该串行似乎假设字节的缓冲区的价值从偏移0。 TBaseHelper根据我所知可以更正偏移量,以便使Serializer实现中的假设生效。

数组in和数组out的长度差异是从错误偏移量开始的结果。序列化值的第一个或第二个字节包含数组的长度。

+0

非常感谢你,克里斯,这解决了问题! – joost1024

0

感谢克里斯我解决了这个问题。串行器现在看起来像这样:

public class FloatArraySerializer extends AbstractSerializer<FloatArray> { 

    private static final FloatArraySerializer instance = 
     new FloatArraySerializer(); 

    public static FloatArraySerializer get() { 
     return instance; 
    } 

    @Override 
    public FloatArray fromByteBuffer(ByteBuffer buffer) { 
     ByteBuffer rightBuffer = TBaseHelper.rightSize(buffer); // This does the trick 
     FloatBuffer floatBuf = rightBuffer.asFloatBuffer(); 
     float[] floats = new float[floatBuf.limit()]; 
     if (floatBuf.hasArray()) { 
      floats = floatBuf.array(); 
     } else { 
      floatBuf.get(floats, 0, floatBuf.limit()); 
     } 
     return new FloatArray(floats); 
    } 

    @Override 
    public ByteBuffer toByteBuffer(FloatArray theArray) { 
     float[] floats = theArray.getDescriptor(); 
     ByteBuffer byteBuf = ByteBuffer.allocate(4 * descriptor.length); 
     FloatBuffer floatBuf = byteBuf.asFloatBuffer(); 
     floatBuf.put(floats); 
     byteBuf.rewind(); 
     return byteBuf; 
    } 

}