Apache Giraph / Hadoop:迭代自定义ArrayWritable

时间:2016-05-27 07:17:24

标签: java hadoop iterator giraph writable

我认为这很容易实现,但它开始变得很痛苦。

我有一个像这样的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计算功能中,Messages是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不适用于类型Object(必需:array或java.lang.Iterable,found:Object)。

  • 将该行更改为for(VertexDistanceWritable distEntry : message.get() ),这会给我error: incompatible types - required: VertexDistanceWritable, found: Writable这是最奇怪的问题 - VertexDistanceWritable扩展了Writable,这不应该工作正常吗?

  • 为VertexDistanceWritable编写我自己的自定义“get_foo()”函数,该函数返回值为VertexDistanceWritable []。当然,值是私有的,并且根据the documentation除了get()之外没有getter函数,我已经遇到了问题

我只想要一种迭代我的VertexDistanceArrayWritable类的方法。这在Hadoop中甚至可能吗?它必须是,对吧?我应该能够迭代我在数组中制作的一堆元素,不是吗?这似乎是非常基本的东西。

1 个答案:

答案 0 :(得分:0)

经过大约30分钟的实验和谷歌搜索,我发现了一条线索here。俗气的,但似乎编译正确。基本上只需使用Writable然后将其转换为我的自定义可写。

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

我还没有确认它是否正常工作,当我确定它有效时,我会更新并确认我的答案。

编辑:它有效。可能需要一个复制构造函数,因为我有一个用于VertexDistanceWritable,但从未检查过。