0

これは簡単に実装できると思っていましたが、面倒になり始めています。

次のような ArrayWritable サブクラスがあります。

public class VertexDistanceArrayWritable extends ArrayWritable {
    public VertexDistanceArrayWritable() {
        super(VertexDistanceWritable.class);
    }
    public VertexDistanceArrayWritable(VertexDistanceWritable[] v) {
        super(VertexDistanceWritable.class, v);
    }
}

そして、次のような Writable サブクラス:

public class VertexDistanceWritable implements Writable {

    //Implements write, readFields, and some custom functions that aren't used yet

}

私の Giraph 計算関数では、メッセージは 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 サブクラスを繰り返し処理したいと考えています。

私は次のことを試しました:

  • その行を変更しfor(VertexDistanceWritable distEntry : message.toArray())て、for-each がオブジェクト型には適用できないことを示します (必須: 配列または java.lang.Iterable、見つかった: オブジェクト)。

  • その行を に変更すると、 --for(VertexDistanceWritable distEntry : message.get() )が得られます。 これは最も奇妙な問題です。VertexDistanceWritable は Writable を拡張しますが、これはうまく機能しないのでしょうか?error: incompatible typesrequired: VertexDistanceWritable, found: Writable

  • 値を VertexDistanceWritable[] として返す VertexDistanceWritable 用の独自のカスタム「get_foo()」関数を作成します。もちろん、値はプライベートであり、すでに問題を抱えている get() 以外のドキュメントによると、ゲッター関数はありません

VertexDistanceArrayWritable クラスを反復処理する方法が必要なだけです。これはHadoopでも可能ですか? そうでなければなりませんよね?配列で作成した一連の要素を反復処理できるはずですよね? かなり基本的なもののようです。

4

1 に答える 1