我有以下Cassandra模式:
ColumnFamily: FloatArrays {
SCKey: SuperColumn Key (Integer) {
Key: FloatArray (float[]) {
field (String): value (String)
}
}
}
为了插入符合此架构的数据,我在赫克托(Hector)中创建了以下模板:
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
}
我是Cassandra / Hector的新手,在这里我会在概念上犯错误吗?现在,我什至不知道哪里出了问题。序列化器似乎还可以。您能为我提供一些指示以继续搜索吗?非常感谢!
最佳答案
我认为您在正确的轨道上。当我使用ByteBuffers时,我有时会需要以下语句:
import org.apache.thrift.TBaseHelper;
...
ByteBuffer aCorrectedByteBuffer = TBaseHelper.rightSize(theByteBufferIWasGiven);
字节缓冲区有时将其值作为偏移量存储到其缓冲区中,但是序列化程序似乎假定字节缓冲区的值从偏移量0开始。 。
数组输入和数组输出的长度差异是从错误的偏移量开始的结果。序列化值的第一个或两个字节包含数组的长度。