Java 在Mahout中序列化RandomAccessSparseVector

Java 在Mahout中序列化RandomAccessSparseVector,java,serialization,hadoop,mahout,Java,Serialization,Hadoop,Mahout,我正在将数据加载到Mahout 0.7中的RandomAccessSparseVector,我不知道如何序列化它。如果我使用的是VectorWritable,我就可以使用SequenceFile.Writer: writer = new SequenceFile.Writer( fs, conf, new Path("filename"), LongWritable.class, VectorWritable.class); 不幸的是,没有可写入的随机访问 一种选择是完全忘记稀

我正在将数据加载到Mahout 0.7中的
RandomAccessSparseVector
,我不知道如何序列化它。如果我使用的是
VectorWritable
,我就可以使用
SequenceFile.Writer

writer = new SequenceFile.Writer(
    fs, conf, new Path("filename"), LongWritable.class,
    VectorWritable.class);
不幸的是,没有可写入的
随机访问

一种选择是完全忘记稀疏向量,将数据加载到一个
VectorWritable
并序列化它。我希望避免这种情况,因为在
矢量可写
中手动输入大量的零,然后在序列化时占用大量磁盘空间是不明智的
RandomAccessSparseVector
也不能强制转换为
VectorWritable

如果有用的话,我已经设置了

Configuration conf = new Configuration();
conf.set("io.serializations",
    "org.apache.hadoop.io.serializer.WritableSerialization");

因此Hadoop知道如何序列化。

解决方案非常简单。在对API文档进行了一段徒劳的挖掘之后,我偶然发现了一篇有用的论坛帖子
VectorWritable
不是向量类型,而是用于序列化的向量包装器。以前,我试图编写一个像这样生成的
RandomAccessSparseVector

RandomAccessSparseVector vect = new RandomAccessSparseVector(columns);
打电话

key = new LongWritable(foo)
RandomAccessSparseVector vect = new RandomAccessSparseVector(columns);
writer.append(key, vect)
我只需要打个电话

writer.append(key, new VectorWritable(vect))