Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hector在Cassandra之间存储和检索浮点[]_Java_Serialization_Nosql_Cassandra_Hector - Fatal编程技术网

Java 使用Hector在Cassandra之间存储和检索浮点[]

Java 使用Hector在Cassandra之间存储和检索浮点[],java,serialization,nosql,cassandra,hector,Java,Serialization,Nosql,Cassandra,Hector,我有以下Cassandra模式: ColumnFamily: FloatArrays { SCKey: SuperColumn Key (Integer) { Key: FloatArray (float[]) { field (String): value (String) } } } 为了插入符合此模式的数据,我在Hector中创建了以下模板: template = new ThriftSuperCfTemplate&

我有以下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());
template=新的ThriftSuperCfTemplate(
键空间,“floatArray”,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;
    }

}
公共类FloatArraySerializer扩展了抽象序列化程序{
私有静态最终FloatArraySerializer实例=
新的FloatArraySerializer();
公共静态FloatArraySerializer get(){
返回实例;
}
@凌驾
来自ByteBuffer的公共浮点数组(ByteBuffer缓冲区){
buffer.rewind();
FloatBuffer floatBuf=buffer.asFloatBuffer();
float[]floats=新的float[floatBuf.limit()];
if(floatBuf.hasArray()){
floats=floatBuf.array();
}否则{
get(floats,0,floatBuf.limit());
}
返回新的浮点数组(浮点);
}
@凌驾
公用字节缓冲区toByteBuffer(浮动数组){
float[]floats=theArray.getFloats();
ByteBuffer byteBuf=ByteBuffer.allocate(4*descriptor.length);
FloatBuffer floatBuf=byteBuf.asFloatBuffer();
浮球(浮球);
byteBuf.rewind();
由特百福返回;
}
}
现在是棘手的一点。存储并检索浮点数组不会返回相同的结果。事实上,数组中的元素数甚至不一样。我用于检索结果的代码如下所示:

SuperCfResult<Integer, FloatArray, String> result = 
    template.querySuperColumns(hash);
for (FloatArray floatArray: result.getSuperColumns()) {
    // Do something with the FloatArrays
}
superfresult结果=
template.querySuperColumns(哈希);
for(FloatArray:result.getSuperColumns()){
//对浮动数组做些什么
}

因为我对卡桑德拉/赫克托很陌生,所以我在这里会犯概念上的错误吗?现在我甚至不知道哪里出了问题。序列化程序似乎还可以。你能为我提供一些继续搜索的提示吗?非常感谢

我认为你的思路是对的。当我与ByteBuffers合作时,我发现有时我需要这样的陈述:

import org.apache.thrift.TBaseHelper;

       ... 

ByteBuffer aCorrectedByteBuffer = TBaseHelper.rightSize(theByteBufferIWasGiven);
字节缓冲区有时将其值作为偏移量存储到其缓冲区中,但序列化程序似乎假定字节缓冲区的值从偏移量0开始。TBaseHelper尽我所能更正偏移量,因此序列化程序实现中的假设是有效的


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

多亏了Chris,我解决了这个问题。序列化程序现在如下所示:

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;
    }

}
公共类FloatArraySerializer扩展了抽象序列化程序{
私有静态最终FloatArraySerializer实例=
新的FloatArraySerializer();
公共静态FloatArraySerializer get(){
返回实例;
}
@凌驾
来自ByteBuffer的公共浮点数组(ByteBuffer缓冲区){
ByteBuffer rightBuffer=tbaseheloper.rightSize(buffer);//这就解决了问题
FloatBuffer floatBuf=rightBuffer.asFloatBuffer();
float[]floats=新的float[floatBuf.limit()];
if(floatBuf.hasArray()){
floats=floatBuf.array();
}否则{
get(floats,0,floatBuf.limit());
}
返回新的浮点数组(浮点);
}
@凌驾
公用字节缓冲区toByteBuffer(浮动数组){
float[]floats=theArray.getDescriptor();
ByteBuffer byteBuf=ByteBuffer.allocate(4*descriptor.length);
FloatBuffer floatBuf=byteBuf.asFloatBuffer();
浮球(浮球);
byteBuf.rewind();
由特百福返回;
}
}