2016-05-27 6 views
0

これは実装が簡単だと思っていましたが、痛みが始まります。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でも可能ですか?それは、そうでなければなりませんか?私は配列で作った要素の束を繰り返し処理できるはずですか?かなり基本的なもののようだ。

答えて

0

約30分の実験とグーグルで、手がかりhereが見つかりました。一種のチーズですが、正しくコンパイルされているようです。基本的にはWritableを使って、それを私のカスタムwritableにキャストします。

for(VertexDistanceArrayWritable message : messages) { 
    for(Writable distWritable : message.get()) { 
     vertexDistanceWritable distEntry = (VertexDistanceWritable) distWritable; 
     //do other stuff 
    } 
} 

正しく動作するかどうかはまだ確認されていません。動作していることを確認したら、更新して回答を確認します。

編集:それが動作します。私はVertexDistanceWritableのためのものを持っていたのでコピーコンストラクタを必要とするかもしれませんが、決してそれをチェックアウトしませんでした。