これは簡単に実装できると思っていましたが、面倒になり始めています。
次のような 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 types
required: VertexDistanceWritable, found: Writable
値を VertexDistanceWritable[] として返す VertexDistanceWritable 用の独自のカスタム「get_foo()」関数を作成します。もちろん、値はプライベートであり、すでに問題を抱えている get() 以外のドキュメントによると、ゲッター関数はありません
VertexDistanceArrayWritable クラスを反復処理する方法が必要なだけです。これはHadoopでも可能ですか? そうでなければなりませんよね?配列で作成した一連の要素を反復処理できるはずですよね? かなり基本的なもののようです。