2

我正在将数据加载到RandomAccessSparseVectorMahout 0.7 中,但我不知道如何对其进行序列化。如果我使用 aVectorWritable我可以这样使用SequenceFile.Writer

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

不幸的是,没有RandomAccessSparseVectorWritable

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

如果它有任何用处,我已经设置

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

以便 Hadoop 知道如何序列化。

4

1 回答 1

3

解决方案非常简单。在对 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))
于 2012-07-01T01:45:17.107 回答