我正在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))