これは実装が簡単だと思っていましたが、痛みが始まります。Apache Giraph/Hadoop:カスタムArrayWritableを反復する
public class VertexDistanceArrayWritable extends ArrayWritable {
public VertexDistanceArrayWritable() {
super(VertexDistanceWritable.class);
}
public VertexDistanceArrayWritable(VertexDistanceWritable[] v) {
super(VertexDistanceWritable.class, v);
}
}
そしてそうのような書き込み可能なサブクラス:私はそうのようなArrayWritableサブクラス持っ
私Giraphの計算機能で
public class VertexDistanceWritable implements Writable {
//Implements write, readFields, and some custom functions that aren't used yet
}
を、メッセージはVertexDistanceArrayWritableのです。すべてのVertexDistanceWritableをすべてのメッセージ(VertexDistanceArrayWritable)で繰り返したいと思います。ここに私の計算機能は次のとおりです。私は、コードをコンパイルすると
@Override
public void compute(Vertex<Text, MapWritable, FloatWritable> vertex,
Iterable<VertexDistanceArrayWritable> messages) throws IOException {
for(VertexDistanceArrayWritable message : messages) {
for(VertexDistanceWritable distEntry : message) {
//Do stuff with distEntry
}
}
//do other stuff
vertex.voteToHalt();
}
、私はこのエラーを取得する:
for-each not applicable to expression type
for(VertexDistanceWritable distEntry : message) {
required: array or java.lang.Iterable
found: VertexDistanceArrayWritable
は、だから今、私は問題を抱えています。私はarrayWritableサブクラスを反復したい。
私は次のことを試してみた:
変更にオブジェクト(必須:配列またはjava.lang.Iterable、見つかっ:Object)を入力するために、各applicaableないことを私に伝えます
for(VertexDistanceWritable distEntry : message.toArray())
にその行を。この行を
for(VertexDistanceWritable distEntry : message.get())
に変更すると、error: incompatible types
-required: VertexDistanceWritable, found: Writable
となります。 これはもっとも不思議な問題です。VertexDistanceWritableはWritableを継承していますが、これは問題ありませんか?VertexDistanceWritableの値を返すVertexDistanceWritableの独自のカスタムget_foo()関数を記述します。もちろん、値はプライベートです、と私はすでに、私はちょうど私のVertexDistanceArrayWritableクラスを反復処理する方法をしたい
に問題を抱えている得る以外the documentation()に応じて何ゲッター機能を持っていません。これはHadoopでも可能ですか?それは、そうでなければなりませんか?私は配列で作った要素の束を繰り返し処理できるはずですか?かなり基本的なもののようだ。