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

writer = new SequenceFile.Writer(
    fs, conf, new Path("filename"), LongWritable.class,
    VectorWritable.class);

不幸的是,没有RandomAccessSparseVectorWritable

一种选择是完全忘记稀疏 vector ,然后将数据加载到VectorWritable中并进行序列化。我想避免这种情况,因为在序列化时手动将零的负载手动输入到VectorWritable中然后在磁盘上占用一堆空间是很草率的。 RandomAccessSparseVector也不能转换为VectorWritable

如果有什么用,我已经设定
Configuration conf = new Configuration();
conf.set("io.serializations",
    "org.apache.hadoop.io.serializer.WritableSerialization");

因此Hadoop知道如何序列化。

最佳答案

解决方案非常简单。经过一番毫无用处的API文档挖掘后,我碰巧遇到了一个有用的论坛帖子。 VectorWritable不是 vector 类型,而是用于序列化的 vector 包装器。以前,我试图写一个像这样生成的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))

07-27 21:08