Java 在Mahout中序列化RandomAccessSparseVector
我正在将数据加载到Mahout 0.7中的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); 不幸的是,没有可写入的随机访问 一种选择是完全忘记稀
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))