我有以下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开始。 。

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

10-08 19:27