2

Mahout 0.7のにデータをロードしてRandomAccessSparseVectorいますが、シリアル化する方法がわかりません。私が使用していた場合、私はそのVectorWritableように使用することができますSequenceFile.Writer

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

RandomAccessSparseVectorWritable残念ながら、ありません。

1つのオプションは、スパースベクトルを完全に忘れて、データをにロードしてVectorWritableシリアル化することです。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 に答える