Java 使用Hector在Cassandra之间存储和检索浮点[]
我有以下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&
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();
由特百福返回;
}
}