我正在将数据加载到Mahout 0.7中的RandomAccessSparseVector
,我不知道如何序列化它。如果我使用VectorWritable
,我可以使用SequenceFile.Writer
:
writer = new SequenceFile.Writer(
fs, conf, new Path("filename"), LongWritable.class,
VectorWritable.class);
遗憾的是,没有RandomAccessSparseVectorWritable
。
一种选择是完全忘记稀疏向量并将数据加载到VectorWritable
并对其进行序列化。我想避免这种情况,因为手动输入零加载到VectorWritable
然后在序列化时在磁盘上占用一堆空间是很草率的。 RandomAccessSparseVector
也不能投放到VectorWritable
。
如果它有用,我已经设置了
Configuration conf = new Configuration();
conf.set("io.serializations",
"org.apache.hadoop.io.serializer.WritableSerialization");
以便Hadoop知道如何序列化。
答案 0 :(得分: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))